通俗易懂讲解Monad的设计模式
一、函数编程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的设计模式相关推荐
- 通俗易懂讲解梯度下降法!
Datawhale干货 作者:知乎King James,伦敦国王大学 知乎 | https://zhuanlan.zhihu.com/p/335191534 前言:入门机器学习必须了解梯度下降法,虽然 ...
- 通俗易懂讲解JavaScript深拷贝和浅拷贝
基本类型和引用类型 在开始讲解JavaScript的深拷贝和浅拷贝之前,先要认识JavaScript的两种基本数据类型.一种是基本类型(值类型),另外一种是引用类型.其中基本类型包括undefined ...
- DOM 之通俗易懂讲解
DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的"遗忘"了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或 ...
- 思成五笔的通俗易懂讲解
从上面五笔学习导图,我们不难看出,五笔只包含两个部分,一是独立字.二是字根字. 1 先来讲解独立字. 独立字就是不用字根就可以输出的汉字,独立字包含一级简码,按键字两种. 一级简码:按一个字母一次,就 ...
- 一维条形码识别的整个过程原理通俗易懂讲解
这里我随便在我的编译原理这本书后面拍的一个条形码来进行说明 以下为一个示意图,一维条形码一共有如下几个区域组成(其实一个条形码下面已经给出了代表哪些数字了,我写的这篇文章讲述其原理,教机器如何读取) ...
- sfr是什么意思通俗易懂讲解
sfr全称为:special function register(翻译为:特殊功能寄存器) 要想明白什么是sfr,需要先了解什么是寄存器 寄存器是RAM和ROM的统称 就像猫科动物是老虎与狮子的统称一 ...
- 89c51的通俗易懂讲解
我是一名单片机工程师,下面的讲解你参考一下. 51单片机共有40只引脚.下面这个就是最小系统原理图,就是靠这四个部分,这个单片机就可以运行起来了.(看下面的数字标记,1234) . 我们来一,一讲解一 ...
- 通俗易懂讲解 [图解]选择排序
文章目录 1.选择排序 2. 图示过程 3.动图展示 4.约定 5.过程 6.代码 1.选择排序 从数组中选择最小元素,将它与数组的第一个元素交换位置.再从数组剩下的元素中选择出最小的元素,将它与数组 ...
- 通俗易懂讲解计算机网络五层模型是如何相互协作的
正文 上面说了一些题外话,哈哈.下面我们开始今天的知识点. 互联网相隔n公里路的两台计算机,是如何进行数据的传送的呢?在成千上万台的计算机中,一台计算机是如何正确着找到另外一个计算机,并把数据传给它的 ...
最新文章
- 高可用集群之分布式文件系统
- java update set_mybatis update set 多个字段实例
- 高速串行总线设计基础(八)揭秘SERDES高速面纱之CML电平标准与预加重技术
- EeePC1000hg安装archlinux20121201和openbox
- ios学习Day3xiawu
- php 判斷數據庫表是否存在,phpl判斷mysq數據庫中的某個數據表是否存在的方法總結...
- php+mysql+like+通配符+变量
- android同步方法和对象的区别是什么,(4.1.10.8)Android Handler之同步屏障机制(sync barrier)...
- 不用图像文件的圆角解决--跳起按钮制作(html)
- 不要再闲玩啦!博主手把手带你两个月入门自然语言处理,还不赶紧碗里来!...
- 大津算法 matlab,大津法---OTSU算法
- 电脑软件故障排除2014年2月16日[不断改进修正版]
- C语言·abs()函数
- MFC 预处理器相关知识
- CSR蓝牙初始化流程
- 免费APP内测分发托管平台,支持应用合并、内测分发、扫码下载,下载量安装量统计,版本记录和应用在线封装打包app
- 求勾股数元祖(java)
- 百度编辑支持word内容和截图的复制黏贴
- spring整合mybatis原理
- 如果大家看了我的tools专栏,里面的小工具有不少,我提炼出来给大家——加密解密
热门文章
- .dat数据文件怎么打开_CAXA线切割版,打开CAD的DWG, DXF文件的终极绝招
- 2022 leetcode 春季赛 LCP 53. 守护太空城
- 微信小程序开发规范文档
- 985博士生盲审未过!学界泰斗喊冤后决定带他去港科大重读博士?
- 物料-零部件分类属性
- 人工智能技术在预测学领域的应用
- 在线订机票系统用例说明
- 采用numpy搭建一个多层的神经网络
- 西藏2021高考成绩排名查询,2021年西藏高考成绩排名表,西藏高考成绩排名顺序查询...
- bzoj4244: 邮戳拉力赛 dp