Haskell 中的Monad 小记

monad基本上可以解释为实现了lift,bind操作的类型类。具体解释可以参考wikipidia上的定义

Monad构成自三个部份:

  • 类型构造子 mmm,建造一个Monad类型mTm\space\space Tm  T
  • 类型转换子,经常叫做unit或return,将一个对象x嵌入到Monad中:
   unit(x) :: x -> Monad x
  • 组合子,典型的叫做bind(约束变量的那个bind),并表示为中缀算子(>>=),去包装一个Monad变量,接着把它插入到一个Monad函数/表达式之中,结果为一个新的Monad:
(>>=) :: forall a b. m a -> (a -> m b) -> m b

1. 解释 (>>=)

(>>=) 是一个二元运算符,它接受两个参数,一个参数是一个Monad(m a),一个参数是一个function(a -> m b).这个function接受的是一个a,返回是一个Monad(m b)
这个运算符做的事情可以理解为,将第一个参数(m a)解包,解出a,按照第二个参数,及那个函数指定的方法得到新的Monad,即(m b)
可以将其理解成 拆解 && 连接


看一个例子
这个例子来源于一个Monad 叫做Maybe.
add mx my = mx >>= λx -> (my >>= λy -> Just (x + y))
λ代表的是匿名函数.Just是Maybe类型的其中一个值构造器。
通过解释上边的例子,可以理解>>=这个运算符
mx解包成x,带入后边的匿名函数中。后边的匿名函数需要输入一个my.然后将y解包,组合x + y后进入Just值构造器。


接下來,看haskell的语法实现和do语法糖

add mx my =mx >>= (\x ->my >>= (\y ->return (x + y)))

实现了上边写的add函数。用do语法糖就可以写成下边的形式.注意,do后语句在不加大括号和分号分割的情况下,缩进要一致。

add mx my = dox <- mxy <- myreturn (x + y)

haskell中的Monad小记相关推荐

  1. 也就是说,Haskell中的monad还是遵守范畴 论的定义,只是应用到计算 机当中罢了?...

    是的,这是正确的.Haskell中的monad遵循范畴论中的定义,但它们是应用于计算机编程语言中的.在Haskell中,monad是一种结构,它允许程序员将复杂的计算流程组织起来,使得代码更加简洁易读 ...

  2. Haskell 中的 Monad 和 IO

    对于 Haskell 初学者来说,Monad 和 IO 或许是掌握 Haskell 之路上的第一大难关.本文将会以尽量浅显的方式介绍 Monad 和 IO 背后的原理和设计思想,希望能够给 Haske ...

  3. Haskell:理解Haskell中的CPS(Cont)

    Haskell中的CPS在Control.Monad.Trans.Cont中定义,文档见于docs,源码见于code. 源码重要的部分主要有三处:1. Cont的定义和一系列方法, 2. ContT ...

  4. asp.net mvc3 Razor引擎中@使用规则小记

    项目中前台用的是asp.net mvc3,Razor引擎(关于Razor的介绍可以参考:http://weblogs.asp.net/scottgu/archive/2010/07/02/introd ...

  5. express 框架中的参数小记

    首发地址:https://clarencep.com/2017/04... 转载请注明出处 注意:req.params 只有在参数化的路径中的参数.查询字符串中的参数要用 req.query. 比如: ...

  6. Java工程中使用Log4j小记

    1.工程中引入log4j的jar包,可到http://logging.apache.org/log4j/1.2/download.html下载: 2.在src目录下配置log4j.properties ...

  7. stateflow中终止节点小记

    对于下面这个节点,当after(5,tick)发生后激活b状态,再当after(1,tick)发生后,执行a1=1,执行完后状态回到b,而不是结束.(这里是回到状态b,不是又进入状态b,所以状态b中的 ...

  8. 看最强大脑中英PK小记

    约束记录表 简朴 勤劳 谦虚 诚恳 禁止浪费 珍惜时间 虚心学习 纯心做人 0 0 0 - 节制 静默 条理 决断 不恋吃睡 开口有益 规整事务 坚持,迅捷 0 - 0 0 正直 中庸 整洁 宁静 贞 ...

  9. scapy python_Python中使用Scapy小记

    本帖最后由 灵·冥 于 2013-1-16 19:15 编辑 原文转自我自己的个人博客: http://www.xsecure.cn/1/post/2012/12/python_scapy.html ...

最新文章

  1. ajax常见问题汇总(二)
  2. 【C++】写一个类重载加减乘除取余运算符
  3. java后台实现自定义排序,java 两种方式实现自定义排序
  4. 谷歌大中华区总裁李开复今日离职
  5. mysql 从服务器_如何使用mysql 主从服务器
  6. mysql数据库java链接,java链接MySQL数据库方法
  7. 629. K个逆序对数组
  8. 【XML系列】----DTD约束(一)
  9. PowerApps概述
  10. python复数类型的虚部通过_Python 复数数据类型详解(complex)[学习 Python 必备基础知识][看此一篇就够了]...
  11. Python学习记录—— 绘制百分比堆积柱状图
  12. 麻省理工学院公开课:计算机科学及编程导论习题3下
  13. 研发人员需要什么知识和能力
  14. JAVA实现Excel照相机功能_excel照相机功能 Excel中鲜为人知的“照相机”功能及使用方法...
  15. 计算机与音乐,计算机音乐与midi
  16. leetcode 1184 看起来很吓人,其实很简单的题目
  17. Laravel 5.4设置logout注销账户的重定向路径
  18. 3D图像重建中的颜色预测误差研究
  19. 【老生谈算法】matlab实现图像压缩算法源码——图像压缩
  20. 学习数学建模之优化类----蒙特卡洛迭代法(自学)+多元线性回归模型(STATA学习应用)+自己听论文排版的课程2022-01-28

热门文章

  1. 网页中默认图片的几种解决方式
  2. android签名图片不显示,android手写签名遇见bitmap黑屏和本地html插入签名图片
  3. luogu P3674 小清新人渣的本愿
  4. java 跨域重定向_跨域解决以及重定向
  5. Windows Mobile Workshop培训第二季(西安,上海,厦门,广州,深圳)
  6. 当客户说“贵”时,你该怎么办?
  7. 计算机计磁盘术语,计算机术语-磁盘
  8. 海象赋值表达式减少重复变量
  9. Python海象运算符的使用
  10. 上周热点回顾(10.16-10.22)