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作者:杨昆 [编写高质量函数系列]中, <如何 ...
随机推荐
- inexact rename detection was skipped due to too many files
https://stackoverflow.com/a/28064699 error: add_cacheinfo failed to refresh for path 'LISA.Kentico.U ...
- ionic 和cordova的区别是什么
很多新朋友ionic基础教程都学完了,还是不知道ionic 和cordova 是什么关系 ionic是什么: Ionic(ionicframework)一款开源的Html5移动App开发框架,是Ang ...
- 苹果Instruments/Shark性能调试工具概述
在Mac OS X上你可以使用Gprof这样的UNIX工具用于测试程序性能.当然,Apple也有自己的Profiling Tools,用得比较多的是Shark.10.5里还引入了一个基于DTrace的 ...
- CodeForces-451E:Devu and Flowers (母函数+组合数+Lucas定理)
Devu wants to decorate his garden with flowers. He has purchased n boxes, where the i-th box contain ...
- BZOJ_2118_墨墨的等式_最短路
BZOJ_2118_墨墨的等式_最短路 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及 ...
- css3 混合模式mix-blend-mode background-blend-mode 以及混合模式的隔断 isolation
css 混合模式 mix-blend-mode: 让 元素内容 和 这个元素 以及 下面的元素 发生混合 background-blend-mode 背景的混合模式 可以是背景图片的混合也可以是背景图 ...
- Ajax跨域访问等问题
前端时间公司接口整顿,所有接口放一起了,然后我就写了一大堆API接口....... 今天用上了,公用人员库,前台通过ajax访问, 先是以‘json’作为数据格式进行访问,直接response fie ...
- Oracle11g for CentOS6-*
lsnrctl startsqlplus /nologstartup
- UI:简单的SQL语句
一.SQL语句如果要在程序运行过程中操作数据库中的数据,那得先学会使用SQL语句1.什么是SQLSQL(structured query language):结构化查询语言SQL是一种对关系型数据库中 ...
- 12_传智播客iOS视频教程_注释和函数的定义和调用
OC的注释和C语言的注释一模一样.它也分单行注释和多行注释. OC程序里面当然可以定义一个函数.并且定义的方式方法和调用的方式方法和我们C语言是一模一样的.OC有什么好学的?一样还学个什么呢? 重点是 ...