Atitit 理解Monad attilax总结

但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在,1

那既然这样就够用了,还要 Monad 干嘛?Monad 的作用在这里就体现出来了,它就是个加强的胶水函数1

但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在,

它必须被模拟出来。目前为止被广泛使用的计算机还是基于图灵机模型,计算机的寄存器、缓存、内存就是用来记录状态的。要真正懂得程序设计,必须知道没有状态的函数是如何在充满状态的计算机上实现的,所以还是绕不开非函数式的编程。另外绝大部分的函数式程序设计语言都不是纯函数式的,出于实用性考虑都夹杂着其他语言的一些特点,并没有完全排斥状态。Haskell 号称纯函数式语言,用 Monad 来抽象状态,理论上可以自圆其说,但在实际使用中其实还是带来了很多不便(于是又发明了 Monad Transformer...)。

从某种程度上说,状态是绕不过去的,毕竟人感知到的宏观世界就是由各种各样有各自状态的对象构成。函数式编程可以帮我们避免很多用其他方式容易犯的错误,在很多情况下写出更高质量的程序,但并发带来的复杂度并不会从根本上消失。各种编程风格一定是互相影响推动程序设计语言的进化,没有绝对的好坏,从 C++ 和 Java 最新标准里引入的函数式方面的功能就很容易看出这一点。比较有意思的是,OOP 最早是在 LISP 里实现的,而 LISP 也被很多人看做函数式编程的起始。同样,好的程序员也会根据具体情况使用合适的编程风格。

那既然这样就够用了,还要 Monad 干嘛?Monad 的作用在这里就体现出来了,它就是个加强的胶水函数

因为不方便。函数式编程的精髓就在于,我们可以用好多好多小小函数,搭搭搭,组成一个个大函数,最终写出整个程序来。如果所有 IO 都要用上面的模型,我们就要把程序里所有需要 IO 的地方都汇总起来,输入做成一个大数据结构,输出做成一个大数据结构,然后再往模型上面凑,很麻烦,这不精髓。

理想的情况是这样:
比如我们想写一个函数

a -> c

然后手头有两个小函数:

a -> b

b -> c

于是我们用一个胶水函数

(a -> b) -> (b -> c) -> (a -> c)

把那两个小函数胶起来,做成我们要的

a -> c

这样是坠好的。

Monad 的作用在这里就体现出来了,它就是个加强的胶水函数。IO Monad 是这些胶水之一,有了它,我们不但可以把小函数胶起来,还能在胶的同时,把他们的头连成一个输入流,把它们的尾巴连成一个输出流,构成最终的 IO 函数,不用吭哧吭哧自己构造 IO 数据结构。

所以,Monad 胶水除了把两个小函数头尾相接拼起来以外,还可以趁机做些别的事情,起到封装一部分操作的作用。不同的胶水作用不同,所以要用不同的类(IO、Maybe 等等)把这些胶水区分开来。然后,

图解 Monad - 阮一峰的网络日志.html

作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

简称 Attilax Akbar 阿提拉克斯 阿克巴

全名:Attilax bin Mahmud bin  attila bin Solomon Akbar Al Rapanui

阿提拉克斯 本 马哈茂德 本 阿提拉 本 所罗门 阿克巴 阿尔 拉帕努伊

常用名:艾提拉(艾龙),   EMAIL:1466519819@qq.com

转载请注明来源:attilax的专栏   http://blog.csdn.net/attilax

--Atiend

Atitit 理解Monad attilax总结Atiti相关推荐

  1. Atitit 理解Monad attilax总结

    Atitit 理解Monad attilax总结 但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在,1 那既然这样就够用了,还要 Monad 干嘛?Monad 的作用在这里就体现出 ...

  2. atitit.薄伽梵歌overview  attilax 读后感

    atitit.薄伽梵歌overview  attilax 读后感 1. 唯一一本记录神而不是神的代言人或者先知言论的经典 2 2. 篇章规模,字数 3 3. 内容摘要 3 4. 主要内容 3 4.1. ...

  3. Atitit 路径规划法attilax总结 扫描线路法

    Atitit 路径规划法attilax总结 扫描线路法 2017/2/8 20:43:37 [吐槽]深圳-小 2017/2/8 20:43:37 群主做什么的 2017/2/10 10:03:15 系 ...

  4. Atitit 互联网思维 attilax著 艾龙 著 1. 引 言 互联网思维制胜传统企业转型   第1节 传统企业互联网化,是未来商业浪潮的主旋律    传统企业的“互联网焦虑症”    互联网思

    Atitit 互联网思维 attilax著 艾龙 著 1. 引 言 互联网思维制胜传统企业转型   第1节 传统企业互联网化,是未来商业浪潮的主旋律   传统企业的"互联网焦虑症" ...

  5. Atitit MATLAB 图像处理attilax总结

    Atitit MATLAB 图像处理attilax总结 1.1. 下载 Matlab7.0官方下载_Matlab2012 v7.0 官方简体中文版-办公软件-系统大全.html1 1.2. Matla ...

  6. 重新理解 Monad

    对于大多数刚刚入门函数式编程的同学来说,monad(单子.又叫单体)可能是这里面的一道坎.你可能对 map . flatMap 以及 filter 再熟悉不过,可是到了高阶的抽象层次上就又会变得一脸懵 ...

  7. Atitit 软件工程概览attilax总结

    Atitit 软件工程概览attilax总结 1.1. .2 软件工程的发展 进一步地,结合人类发展史和计算机世界演化史来考察软件工程的发展史. 表2 软件工程过程模型 表2将软件工程的主要过程模型做 ...

  8. 理解Monad,一份monad的解惑指南

    \ 本文要点: \\ 避免显式地处理状态值是有必要的\\t 通过使用monad,你就可以移除代码中对状态值的明确处理.\\t 一个monads类型必须与特殊的函数(名为"bind" ...

  9. Atitit q2016 qb doc list on home ntpc.docx

    Atitit q2016 qb doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0-D3C8 D:\ati ext notbek\q201 ...

  10. Atitit 算法之道 attilax著 1. 编码算法 3 1.1. Base64 htmlencode urlencode 3 2. Ui方面的算法 3 2.1. 软键盘算法 计算软键盘上下

    Atitit 算法之道 attilax著 1. 编码算法 3 1.1. Base64 htmlencode  urlencode 3 2. Ui方面的算法 3 2.1. 软键盘算法  计算软键盘上下左 ...

最新文章

  1. FreeBSD 6.0架设管理与应用-第三章 UNIX 系统入门
  2. java redis多主多备_java 集成Redis 一主多从
  3. h5实现手机端等级进度条
  4. 部署 Communicator Web Access
  5. Apache RocketMQ 荣获 2021 中国开源云联盟优秀开源项目
  6. 35/100. Permutations
  7. 微信小程序页面跳转与返回并回传数据
  8. svn怎么检出两个地址项目_svn 检出项目报错
  9. 使用decode函数
  10. JS判断页面是否出现滚动条
  11. Hyper-V 2016 系列教程49 Windows Server Backup 备份计划的新建备份、修改备份和停止备份...
  12. 设置视图IOS开发(97)之自定义视图之使用XIB自定义一个UIView
  13. python 提示框如何顶层显示_python tkinter之顶层菜单、弹出菜单实例
  14. 企业微信可以同步微信好友吗?怎么同步?
  15. 查看java堆栈信息
  16. 理解RoIAlign实际操作
  17. 文件上传控件-如何上传文件-大文件断点续传
  18. autocad2014点击保存闪退_windows10下AutoCAD 2014打开出现闪退怎么办
  19. Linux安装jdk
  20. vue——一个页面实现音乐播放器

热门文章

  1. python闭包有什么作用_闭包在实际开发中有什么用?
  2. linux svn与apache,linux下svn与apache整合搭建
  3. WCDMA中3.84M码片速率和5M带宽的由来
  4. 2.并发编程--线程基础
  5. php 基于redis计数器类
  6. 省市联动_简单的Demo,适用于各种二级菜单联动
  7. 解决position:fixed抖动的问题
  8. JDC job obend
  9. 一个比较完整的短信接口帮助类参考
  10. Extjs 之dataview布局