Functor、Applicative 和 Monad x
首先,我们来看一下 Functor typeclass 的定义:
| 
 1 2  | 
 class Functor f where fmap :: (a -> b) -> f a -> f b  | 
Functor typeclass fmap (a -> b) f a f b f Functor 注:fmap 函数可类比 Swift 中的 map 方法。
Applicative typeclass
同样的,我们先来看一下 Applicative typeclass 的定义:
| 
 1 2 3  | 
 class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b  | 
我们注意到,与 Functor typeclass 的定义不同的是,在 Applicative typeclass 的定义中多了一个类约束 Functor f ,表示的意思是数据类型 f 要实现 Applicative typeclass 的前提条件是它必须要实现 Functor typeclass ,也就是说它必须是一个 Functor 。
在 Applicative typeclass 中定义了两个函数:
- pure a (<*>) :将一个在上下文中的函数 f (a -> b) 应用到一个在上下文中的值 f a ,并返回另一个在上下文中的值 f b 。
 
同样的,我们先来看一下 Monad typeclass 的定义:
| 
 1 2 3 4 5 6 7 8 9 10  | 
 class Applicative m => Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b x >> y = x >>= \_ -> y fail :: String -> m a fail msg = error msg  | 
Monad typeclass return(>>=)(>>) fail (>>) fail Monad typeclass
| 
 1 2 3  | 
 class Applicative m => Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b  | 
怎么样?现在看上去就好多了吧。跟 Applicative typeclass 的定义一样,在 Monad typeclass 的定义中也有一个类约束 Applicative m ,表示的意思是一种数据类型 m 要成为 Monad 的前提条件是它必须是 Applicative 。另外,其实 return 函数的功能与 Applicative 中的 pure 函数的功能是一样的,只不过换了一个名字而已,它们的作用都是将一个值 a 放入上下文中。而 (>>=) 函数的功能则是应用一个(接收一个普通值 a 但是返回一个在上下文中的值 m b 的)函数 (a -> m b) 到一个上下文中的值 m a ,并返回另一个在相同上下文中的值 m b 。
Functor、Applicative 和 Monad x的更多相关文章
- 泛函编程(28)-粗俗浅解:Functor, Applicative, Monad
		
经过了一段时间的泛函编程讨论,始终没能实实在在的明确到底泛函编程有什么区别和特点:我是指在现实编程的情况下所谓的泛函编程到底如何特别.我们已经习惯了传统的行令式编程(imperative progra ...
 - Monad / Functor / Applicative 浅析
		
前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...
 - Functor、Applicative 和 Monad(重要)
		
Functor.Applicative 和 Monad Posted by 雷纯锋Nov 8th, 2015 10:53 am Functor.Applicative 和 Monad 是函数式编程语言 ...
 - 浅释Functor、Applicative与Monad
		
引言 转入Scala一段时间以来,理解Functor.Applicative和Monad等概念,一直是我感到头疼的部分.虽然读过<Functors, Applicatives, And Mona ...
 - Functor、Applicative 和 Monad
		
Functor.Applicative 和 Monad 是函数式编程语言中三个非常重要的概念,尤其是 Monad. 说明:本文中的主要代码为 Haskell 语言,它是一门纯函数式的编程语言. 一.结 ...
 - 函数编程中functor和monad的形象解释
		
函数编程中functor和monad的形象解释 函数编程中Functor函子与Monad是比较难理解的概念,本文使用了形象的图片方式解释了这两个概念,容易理解与学习,分别使用Haskell和Swift ...
 - Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern
		
Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...
 - 泛函编程(27)-泛函编程模式-Monad Transformer
		
经过了一段时间的学习,我们了解了一系列泛函数据类型.我们知道,在所有编程语言中,数据类型是支持软件编程的基础.同样,泛函数据类型Foldable,Monoid,Functor,Applicative, ...
 - 如何编写高质量的 JS 函数(3) --函数式编程[理论篇]
		
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/EWSqZuujHIRyx8Eb2SSidQ作者:杨昆 [编写高质量函数系列]中, <如何 ...
 
随机推荐
- 【转】Commonjs规范及Node模块实现
			
前言: Node在实现中并非完全按照CommonJS规范实现,而是对模块规范进行了一定的取舍,同时也增加了少许自身需要的特性.本文将详细介绍NodeJS的模块实现 引入 nodejs是区别于javas ...
 - 《JAVA与模式》之迭代子模式
			
迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(internal representation). 聚集和JAVA聚集 多个 ...
 - 虚拟机C盘扩容
			
使用 <分区助手> 下载地址:http://115.com/file/belj8wkm
 - Linux后门入侵检测工具,附bash漏洞解决方法
			
一.rootkit简介 rootkit是Linux平台下最常见的一种木马后门工具,它主要通过替换系统文件来达到入侵和和隐蔽的目的,这种木马比普通木马后门更加危险和隐蔽,普通的检测工具和检查手段很难发现 ...
 - pascal倒序输出
			
program Project6; {$APPTYPE CONSOLE} uses SysUtils; var a,b,c,d:integer; begin { TODO -oUser -cConso ...
 - postgresql 9.4.4 源码安装
			
Postgresql下载网址: http://www.postgresql.org/ftp/source/ 这里我们选择最新的稳定版版postgresql-9.4.4 的源码版 https://ftp ...
 - bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】
			
参考:https://www.cnblogs.com/lcf-2000/p/6789680.html 这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/ ...
 - 洛谷 P3357 最长k可重线段集问题【最大流】
			
pre:http://www.cnblogs.com/lokiii/p/8435499.html 和最长k可重区间集问题差不多,也就是价值的计算方法不一样,但是注意这里可能会有x0==x1的情况也就是 ...
 - golang——关于for循环的学习
			
1.for循环的用法 (1)常规用法 func main() { slice := []int{1, 2, 3, 4, 5, 6} //方式1 for i := 0; i < len(slice ...
 - nginx静态资源服务器简单配置
			
有时候我们可以把服务器的一些文件放在固定目录以便下载,比如image,css,js等.就可以使用nginx转发静态资源. 参考链接:https://blog.csdn.net/name_is_wl/a ...