一、函数编程Monad

函数式编程有一个重要概念,叫做Monad。

网上有很多解释(这里和这里),但都很抽象,不容易看懂。我尝试了好多次,还是不明白Monad到底是什么。

昨天,我读到了Aditya Bhargava的文章,他画了很多图。我想了半天,终于恍然大悟。下面,我就用这些图来解释Monad。

1.

软件最基本的数据,就是各种值(value)。

2.

处理值的一系列操作,可以封装成函数。输入一个值,会得到另一个值。上图的"(+3)"就是一个函数,对输入的值加上3,再输出。

3.

函数很像漏斗,上面进入一个值,下面出来一个值。

4.

函数可以连接起来使用,一个函数接着另一个函数。

5.

函数还可以依次处理数据集合的每个成员。

6.

说完了函数,再来看第二个概念:数据类型(type)。

数据类型就是对值的一种封装,不仅包括值本身,还包括相关的属性和方法。上图就是2的封装,从此2就不是一个单纯的值,而是一种数据类型的实例,只能在数据类型的场景(context)中使用。

7.

2变成数据类型以后,原来的函数就不能用了。因为"(+3)"这个函数是处理值的(简称"值函数"),而不是处理数据类型的。

8.

我们需要重新定义一种运算。它接受"值函数"和数据类型的实例作为输入参数,使用"值函数"处理后,再输出数据类型的另一个实例。上图的fmap就代表了这种运算。

9.

fmap的内部,实际上是这样:打开封装的数据类型,取出值,用值函数处理以后,再封装回数据类型。

10.

一个有趣的问题来了。如果我们把函数也封装成数据类型,会怎样?

上图就是把函数"(+3)"封装成一种数据类型。

11.

这时,就需要再定义一种新的运算。它不是值与值的运算,也不是值与数据类型的运算,而是数据类型与数据类型的运算。

上图中,两个数据类型进行运算。首先,取出它们各自的值,一个是函数,一个是数值;然后,使用函数处理数值;最后,将函数的返回结果再封装进数据类型。

12.

函数可以返回值,当然也可以返回数据类型。

13.

我们需要的是这样一种函数:它的输入和输出都是数据类型。

14.

这样做的好处是什么?

因为数据类型是带有运算方法的,如果每一步返回的都是数据类型的实例,我们就可以把它们连接起来。

15.

来看一个实例,系统的I/O提供了用户的输入。

16.

getLine函数可以将用户的输入处理成一个字符串类型(STR)的实例。

17.

readfile函数接受STR实例当作文件名,返回一个文件类型的实例。

18.

putStrLn函数将文件内容输出。

19.

所有这些运算连起来,就叫做Monad。

简单说,Monad就是一种设计模式,表示将一个运算过程,通过函数拆解成互相连接的多个步骤。你只要提供下一步运算所需的函数,整个运算就会自动进行下去。

通俗易懂讲解Monad的设计模式相关推荐

  1. 通俗易懂讲解梯度下降法!

    Datawhale干货 作者:知乎King James,伦敦国王大学 知乎 | https://zhuanlan.zhihu.com/p/335191534 前言:入门机器学习必须了解梯度下降法,虽然 ...

  2. 通俗易懂讲解JavaScript深拷贝和浅拷贝

    基本类型和引用类型 在开始讲解JavaScript的深拷贝和浅拷贝之前,先要认识JavaScript的两种基本数据类型.一种是基本类型(值类型),另外一种是引用类型.其中基本类型包括undefined ...

  3. DOM 之通俗易懂讲解

    DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的"遗忘"了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或 ...

  4. 思成五笔的通俗易懂讲解

    从上面五笔学习导图,我们不难看出,五笔只包含两个部分,一是独立字.二是字根字. 1 先来讲解独立字. 独立字就是不用字根就可以输出的汉字,独立字包含一级简码,按键字两种. 一级简码:按一个字母一次,就 ...

  5. 一维条形码识别的整个过程原理通俗易懂讲解

    这里我随便在我的编译原理这本书后面拍的一个条形码来进行说明 以下为一个示意图,一维条形码一共有如下几个区域组成(其实一个条形码下面已经给出了代表哪些数字了,我写的这篇文章讲述其原理,教机器如何读取) ...

  6. sfr是什么意思通俗易懂讲解

    sfr全称为:special function register(翻译为:特殊功能寄存器) 要想明白什么是sfr,需要先了解什么是寄存器 寄存器是RAM和ROM的统称 就像猫科动物是老虎与狮子的统称一 ...

  7. 89c51的通俗易懂讲解

    我是一名单片机工程师,下面的讲解你参考一下. 51单片机共有40只引脚.下面这个就是最小系统原理图,就是靠这四个部分,这个单片机就可以运行起来了.(看下面的数字标记,1234) . 我们来一,一讲解一 ...

  8. 通俗易懂讲解 [图解]选择排序

    文章目录 1.选择排序 2. 图示过程 3.动图展示 4.约定 5.过程 6.代码 1.选择排序 从数组中选择最小元素,将它与数组的第一个元素交换位置.再从数组剩下的元素中选择出最小的元素,将它与数组 ...

  9. 通俗易懂讲解计算机网络五层模型是如何相互协作的

    正文 上面说了一些题外话,哈哈.下面我们开始今天的知识点. 互联网相隔n公里路的两台计算机,是如何进行数据的传送的呢?在成千上万台的计算机中,一台计算机是如何正确着找到另外一个计算机,并把数据传给它的 ...

最新文章

  1. 高可用集群之分布式文件系统
  2. java update set_mybatis update set 多个字段实例
  3. 高速串行总线设计基础(八)揭秘SERDES高速面纱之CML电平标准与预加重技术
  4. EeePC1000hg安装archlinux20121201和openbox
  5. ios学习Day3xiawu
  6. php 判斷數據庫表是否存在,phpl判斷mysq數據庫中的某個數據表是否存在的方法總結...
  7. php+mysql+like+通配符+变量
  8. android同步方法和对象的区别是什么,(4.1.10.8)Android Handler之同步屏障机制(sync barrier)...
  9. 不用图像文件的圆角解决--跳起按钮制作(html)
  10. 不要再闲玩啦!博主手把手带你两个月入门自然语言处理,还不赶紧碗里来!...
  11. 大津算法 matlab,大津法---OTSU算法
  12. 电脑软件故障排除2014年2月16日[不断改进修正版]
  13. C语言·abs()函数
  14. MFC 预处理器相关知识
  15. CSR蓝牙初始化流程
  16. 免费APP内测分发托管平台,支持应用合并、内测分发、扫码下载,下载量安装量统计,版本记录和应用在线封装打包app
  17. 求勾股数元祖(java)
  18. 百度编辑支持word内容和截图的复制黏贴
  19. spring整合mybatis原理
  20. 如果大家看了我的tools专栏,里面的小工具有不少,我提炼出来给大家——加密解密

热门文章

  1. .dat数据文件怎么打开_CAXA线切割版,打开CAD的DWG, DXF文件的终极绝招
  2. 2022 leetcode 春季赛 LCP 53. 守护太空城
  3. 微信小程序开发规范文档
  4. 985博士生盲审未过!学界泰斗喊冤后决定带他去港科大重读博士?
  5. 物料-零部件分类属性
  6. 人工智能技术在预测学领域的应用
  7. 在线订机票系统用例说明
  8. 采用numpy搭建一个多层的神经网络
  9. 西藏2021高考成绩排名查询,2021年西藏高考成绩排名表,西藏高考成绩排名顺序查询...
  10. bzoj4244: 邮戳拉力赛 dp