首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么是 Monad (Functional Programming)?函子到底是什么?ApplicativeMonad

也就是说,如果我们要将普通函数应用到一个有盒子上下文包裹值,那么我们首先需要定义一个叫Functor数据类型,在这个数据类型需要定义如何使用map或fmap来应用这个普通函数。...image.png fmap输入参数是a->b函数,在我们这个案例是(+3),然后定义一个函子Functor,这里是HaskellJust 2,最后返回一个函子,在我们案例使用Haskell...函数identity是一个函数特例,它接收什么参数就返回什么参数,所以入参和返回值不仅类型一致,而且值也相同。...澄清了函子含义,那么如何在程序中表达它? 在Haskell,函子是在其可以map over东西。稍微有一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。...不过,在我们例子,List并不是一个具体类型,而是一个类型构造子。举个例子,构造List[Int],也就是把Int提升到List[Int],记作Int -> List[Int]。

4.2K30

Monad

函数identity是一个函数特例,它接收什么参数就返回什么参数,所以入参和返回值不仅类型一致,而且值也相同。...澄清了函子含义,那么如何在程序中表达它? 在Haskell,函子是在其可以map over东西。稍微有一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。...不过,在我们例子,List并不是一个具体类型,而是一个类型构造子。举个例子,构造List[Int],也就是把Int提升到List[Int],记作Int -> List[Int]。...这就表达了元素间关系也可以映射为另一个范畴元素间关系。 所以类型构造器List[T]就是一个函子。 理解了函子概念,接着继续探究什么是自函子。...在Haskell这类强类型语言中,我们甚至可以组装自己Tuple Monad

1.2K50
您找到你想要的搜索结果了吗?
是的
没有找到

函子定律

在范畴论,函子是范畴间态射(这个定义给我直观感受是函子指的是 fmap 函数……),数学上概念就不多说了,下面我们来看看 Haskell Functor。...Haskell 中有一个叫 Functor 类型(暂时可以粗略地理解为 OO 语言中接口),它定义是这样: class Functor f where fmap :: (a -> b) -...> f a -> f b Functor 实例不是一个具体类型,而是一个类型构造器(暂时理解为类似范型东西),譬如 Int、Maybe Int 都是具体类型,而 Maybe 就是个类型构造器。...事实并不是这样,函子毕竟是一个数学概念,它必须满足函子定律: fmap id = id famp (f . g) = fmap f . fmap g id 是一个原样返回参数函数(id x = x)...这两条定律可以保证在一个函子值执行 fmap 只会在它上面映射一个函数——不再做其他事情。

90620

当我们谈论Monad时候(二)

Applicative是对“应用”抽象,它允许在容器“存放”一个函数。 还是用例子来说明。一篇文章最后,我举了一个多参函数例子。当时我们封装了一个函数liftM2用来处理2参数函数。...而就是对函数与值都进行模式匹配,在有值情况下将值应用给函数。 对于列表来说,情况可能稍微复杂一点。因为参数可能是多个函数多个值。...它行为就是取第一个参数m a值,将其应用在第二个参数函数(这个函数也叫monadic map)。由于这个函数并不是在容器,因此>>=实现比起Applicative要更容易些。...HaskellIO函数都会返回一个IO Monad,而上面的代码,我们并没有对每一条都使用之前结果。对于部分IO MonadputStrLn返回),我们直接就抛弃了这些返回值。...我们之前实现List在处理多参数时会遍历所有可能组合(笛卡尔积),而ZipList更贴近使用习惯,它会按照同一个位置元素来遍历多个列表。

77810

深入理解函数式编程(下)

React Hooks设计是很巧妙,以useEffect为例: 图 43 在函数组件,useState用来产生状态,在使用useEffect时候,我们需要挂载这个state到第二个参数,而第一个参数给到运行函数在...首先,fmap目的是把数据从一个类型映射到另一个类型,而JavaScript里面的map函数实际就是这个功能。...实际使用一个Maybe要么是Just要么是Nothing。因此,这里用Maybe(..)构造可能让我们难以理解。...图 62 你可以想象为Just增加了一个抽象实现,这个抽象为: 图 63 这个抽象我们称为“应用函子”,它可以保存一个函数作为内部值,并且使用apply方法可以把这个函数作用到另一个Monad...我们使用函数式编程思想,把多个看似不相关函数进行组合,得到了业务需要subscribe函数,但同时,上面的任意一个函数都可以被用于其他功能组合。

89330

Kotlin版图解Functor、Applicative与Monad

但是 fmap 怎么知道如何应用该函数呢? 究竟什么是 Functor 呢? 在 Haskell Functor 是一个类型。 其定义如下: ?...“大人物可以使用具有任意数量参数函数,”它说。 “装备了 ($) 与 (*) 之后,我可以接受具有任意个数未包装值参数任意函数。 然后我传给它所有已包装值,而我会得到一个已包装值出来!...然后把它扔掉,因为在本节你并不需要! Monad 增加了一个转变。 Functor 将一个函数应用到一个已包装: ?...MonadHaskell 一个类型。...(Haskell )applicative 是实现了 Applicative 类型数据类型。 (Haskell monad 是实现了 Monad 类型数据类型。

1.2K20

深入理解函数式编程(下)

React Hooks设计是很巧妙,以useEffect为例: 在函数组件,useState用来产生状态,在使用useEffect时候,我们需要挂载这个state到第二个参数,而第一个参数给到运行函数在...首先,fmap目的是把数据从一个类型映射到另一个类型,而JavaScript里面的map函数实际就是这个功能。...**构造可能让我们难以理解。 如果非要理解的话,可以理解Maybe为Nothing和Just抽象,Just和Nothing构成这个抽象两个实现。...你可以想象为Just增加了一个抽象实现,这个抽象为: 这个抽象我们称为“应用函子”,它可以保存一个函数作为内部值,并且使用apply方法可以把这个函数作用到另一个Monad。...我们使用函数式编程思想,把多个看似不相关函数进行组合,得到了业务需要subscribe函数,但同时,上面的任意一个函数都可以被用于其他功能组合。

43810

铁定不纯IO_Haskell笔记5

Haskell提供了do语句块,也是用来隔离不纯部分 一.I/O action 先看个函数类型: > :t print print :: Show a => a -> IO () print函数接受一个...(与C语言类似),do用来把多个I/O Action合并成一个,返回被合并最后一个I/O Action。...圈定不纯环境类似于async function,I/O Action只能出现在do语句块,这一点似于await P.S.实际,执行I/O Action有3种方式: 绑定给main时,作为入口函数...场景,mapM第一个参数是输入a输出IO b函数,第二个参数是[a],返回IO [b],返回值类型与sequence一致。...,作用相同: > forM [1, 2, 2] print 1 2 2 [(),(),()] 只是形式区别,如果第二个参数传入函数比较复杂,forM看起来更清楚一些,例如: main = do

1.3K30

Monad来得更猛烈些吧_Haskell笔记11

这样做是为了把一个值包进函数context,使之能够参与函数运算: 要让一个函数能够是某个定值唯一方法就是让他完全忽略他参数。...>>=从实现看会生成一个函数(\ r -> k (f r) r),该函数接受一个参数(r),这个参数会被传递给左侧monadic value(也是个函数,f),再把返回值(f r)传递给右侧函数...Function Monad实际作用: 把所有的函数都黏在一起做成一个函数,然后把这个函数参数都喂给全部组成函数,这有点取出他们未来意味 P.S....P.S.能够从共享环境读取值,这也是称之为Reader Monad原因 三.State Monad 除日志追踪、共享环境外,还有一最常见问题是状态维护 然而,有一些领域问题根本就是依赖于随着时间而改变状态...Monad意义在于,从这些常见场景抽象出通用模式,以简化操作,比如状态维护、日志收集等都能够通过Monad自动完成 单从使用角度来看,用Monad包一下(没错,就这么简单),就能获得额外能力,

1.5K40

编程语言:类型系统本质

例如,T或Box>有一个类型参数T,后者又有一个类型参数U。 正如高阶函数是接受其他函数作为实参函数,高阶类型是接受其他种类作为实参种类(参数类型构造函数)。...类型构造函数 在类型系统,我们可以认为类型构造函数是返回类型一个函数。我们不需要自己实现类型构造函数,因为这是类型系统在内部看待类型方式。 每个类型都有一个构造函数。一些构造函数很简单。...泛型类型,T[],需要一个实际类型参数来生成一个具体类型。其类型构造函数为(T) -> [T[] type]。...封装允许隐藏数据和方法,而继承则使用额外数据和代码扩展一个类型。 封装出现在多个层次,例如,服务将其API公开为接口,模块导出其接口并隐藏实现细节,只公开公有成员,等等。...那么 1 就是单位元(乘法单位元) Ok,我们已经了解了所有应该掌握专业术语,那就简单串解一下这段解释吧: 一个 自函子 范畴 幺半群 ,可以理解为: 在一个满足结合律和单位元规则集合,存在一个映射关系

2.6K31

Heskell与函数式编程

导语 :这个系列打算分为三部分,由浅入深地介绍所谓函数式编程 1)Haskell入门 2)Monad介绍 3)函数式编程思想 Haskell简介 Haskell诞生于1990年,是一门纯函数式编程语言...函数式编程和命令式编程有本质区别,命令式编程是基于冯诺依曼体系抽象,通俗点来说就是像电脑运作般思考,而函数式编程更多是数学抽象函数概念,也就是输入和输出映射关系。...从这里可以看到,Haskell基本处理单位是函数函数是一等公民),一个函数可以成为另外一个函数输入,函数和数学范畴映射是一样。...( a -> a ) -> a ,最后一个参数输出,前面两个a是入参,用文字来描述就是: 输入两个Ord参数,输出一个Ord输出。...用文字来表述: 入参是(Ord , Ord , (Eq , Fractional) )三个参数,出参是一个Boolean值,其中z具有Eq和Fractional两个特性,Eq作用是能够做==比较

79670

【单子】说白了不过就是【自函子范畴】一个【幺半群】而已?请说人话!!

,被 Monad 函数包裹住含副作用函数,根本就和纯函数是一样一样,因为: 你无法知道一间黑色房间里面有没有一只黑色猫; 在编程开发,尤其是多人协作一个数据要经过各种计算、加入各种逻辑...(函子)和业务输出(链式操作)剥离开来,会让这个“转述”过程更准确、清晰; wiki Monad 没错,一小节 Monad 只说了它应用示例,此小 bar 来看看它在 wiki 【超干】...可以直接这样理解:Monad 是一种特殊数据结构,它能把值进行包装,然后链接执行;王垠在《对函数式语言误解》准确了描述了 Monad 本质: Monad 本质是使用类型系统“重载”(overloading...阶段小结 函数式编程,处处都是惰性思维体现; Monad 也是惰性计算实践之一;至于标题中这句话:【单子】说白了不过就是【自函子范畴】一个【幺半群】而已?...推荐阅读 函数式语言宗教 图解 Monad JS Monad 学习函数式编程 Monad monadic.ts 如何解释 Haskell 单子(Monad

99220

Monad_Haskell笔记10

P.S.关于computation context详细信息,见Functor与Applicative_Haskell笔记7 用来解决context相关计算一个场景:怎样把一个具有context函数应用到具有...context值 (>>=) :: (Monad m) => m a -> (a -> m b) -> m b 如果你有一个具有context值m a,你能如何把他丢进一个只接受普通值a函数,并回传一个具有...也就是说,你如何套用一个型态为a -> m b函数至m a? 用来解决context相关计算最后一个场景:怎样把一个输入普通值输出具有context函数,应用到具有context值?...可以返回一个数组(或者结构体、链表等都行),把多个值组织到一起(放进一个数据结构),打包返回 如果一个函数返回个数组,就不确定他返回了多少个结果,这就是所谓不确定环境 从ListMonad实现来看... b -> a const x _ = x 作用是丢弃第一个参数

70850

如何更优雅使用 Java 8 函数式编程?

Java8Stream和Optional给我们带来了函数式编程乐趣,但Java仍然缺少很多函数编程关键特性。 Lambda表达式、Optional和Stream只是函数式编程冰山一角。...这也导致了varvr和functionlajava这些出现,他们都源于Haskell这个纯函数式编程语言。...如果想要更加地“函数式”编程,那么首先要注意是不要过早中断monad(一种设计模式,表示将一个运算过程通过函数拆解成互相连接多个步骤。...、一个Optional结果函数,使得被提升函数具有Optional一个特性:如果一个参数是空,那么结果就是空。...如果JDK抽取flatMap和map到一个公共接口,Monad,那么我们可以为Java Monad一个实例(Stream、Lambda、自己实现)实现一个公共提升函数

1.3K20

实现TypeScript运行时类型检查

Parser返回值.这个类型转换具有通用性, 是函数式编程一个重要抽象, 在本节中会化一些篇幅对其推导, 最终将改抽象对应到Haskell sequenceA函数.为了Either[...(t a)这段类型签名Applicative f =>是Haskell 类型约束, 在余下篇幅中会对其重点讲解, 可以暂时对其忽略.即, Haskell 已经有我们所需要类型转行抽象, 函数名为...class.代码示例所示, ap可以通过Monad.chain实现, 那么其意义是什么?...答案是Monad是比Applicative更加"强大", 但也更加严格约束.一个函数, 对其依赖类型拥有更加宽松类型约束, 其使用场景也会更加广泛, 例如:type Move = (o: Animal...能够对一系列上下文进行串联并且收集其中值.Monad在Applicative基础, 能够基于一个上下文中值, 灵活地创建另外一个包裹在上下文中值. -- stackoverflow回答在Promise.all

2.4K30

不可变状态

计算机函数」则不一定,在大多数编程语言中,一个函数除了能接收参数并返回一个值之外,它还能有副作用,例如,它可以修改变量,可以在屏幕打印字符串,可以读写文件等等,这些操作使得我们无法通过输入内容直接确定输出结果...在编程,我们只需要知道如果一个参数化类型 M 定义了如下两个操作: unit : A => M[A] bind : M[A] => (A => M[B]) => M[B] 并且这两个操作满足「Monad...从上面的定义可以大致看出 unit 是一个 Monad 构造器,对于 M 类型 Monad 而言,如果将 unit 应用于一个 T 类型值,那么它将构造一个 M[T] 类型值。...只不过 IO 所管理状态不是一个变量而是程序与整个世界之间交互所有 IO 操作。在 Haskell ,IO Monad一个基础 Monad 6。...而在这样环境下,Haskell 产生输入输出这样副作用方式就是使用 IO Monad

97020

学习函数式编程 Monad

Monad 定义 Monad 使用场景 Monad 一句话解释 Monad 定义 根据维基百科定义,Monad 由以下三个部分组成: 一个类型构造函数(M),可以构建出一元类型 M。...Monad 构造函数 unit(value) { this.value = value; } // bind,把值转换成一个 Monad bind(fn) { return...Ok,我们已经明白了 Monad 内部结构,接下来,我们再看一下 Monad 使用场景。 Monad 使用场景 通过 Monad 规则,衍生出了许多使用场景。 组装多个函数,实现链式操作。...那么 1 就是单位元(乘法单位元) Ok,我们已经了解了所有应该掌握专业术语,那就简单串解一下这段解释吧: 一个 自函子 范畴 幺半群 ,可以理解为,在一个满足结合律和单位元规则集合,存在一个映射关系...,这个映射关系可以把集合元素映射成当前集合自身元素。

70120

你觉得“惰性求值”在 JS 中会怎么实现?

接上一篇《听君一席话,听一席话,解释解释“惰性求值”~》,有掘友问:“我懂惰性求值意思了,但是在 JS 如何实现 thunk 呢?”...它指的是在计算过程,一些函数参数或者一些结果通过一段程序来代表,这被称为 thunk。...可以简单地把 thunk 看做是一个未求得完全结果表达式与求得该表达式结果所需要环境变量组成函数,这个表达式与环境变量形成了一个参数闭包(parameterless closure),所以 thunk...以实现 take 方法为例: 在 Haskell ,take 函数可以从头连续地取得一个列表几个元素; Prelude> take 3 [1,2,3,4,5] [1,2,3] JS 模拟实现 take...—— Jake Archibald 再回看 wiki 上关于闭包这句解释: 闭包用途:因为闭包只有在被调用时才执行操作(暂且不论用于生成这个闭包对象本身开销,比如 C++ 按值捕获意味着执行复制构造函数

1.4K20
领券