首页 > 教育学习 > 为什么 > 什么是 Monad (Functional Programming)?

什么是 Monad (Functional Programming)?
2012-01-19 19:34:17   来源:   点击:

    什么是 Monad (Functional Programming)?读过
    1. en.wikipedia.org/wiki...
    2. stackoverflow.com/question...
    之后仍旧不能在头脑中建立起比较直觉化的对应模型,也想不出除去范例中那几个之外的应用场景,很痛苦,求解脱。

    6 个答案

    • 答案 1:

      函数式语言没有赋值没有副作用,接纳外部世界的输入,就只能通过参数。可以认为Monad就是这样的一个机制,把副作用转放参数里(return :: a - > M a),并允许这些函数连续( > > =)起来,形成类似副作用的操作。就“连续操作”的原理而言,个人感觉与Continuation Passing Style并无二致,不过外面多了一个类型系统。Haskell爱好者们谈起Monad,一般也额外带上了do-notation这种语法糖。lisp/ML/javascript/ruby等等支持高阶函数的语言在理论上都可以实现Monad,但是只有haskell的最好看。也只有haskell将Monad实现在了标准库里,并成为语言不可或缺的一部分。就像C++程序员必须理解模板一样,Haskell爱好者们也不得不绞尽脑汁,翻遍paper理解这些似乎毫无道理的神秘物质。但这终究还是装纯带来的代价啊...
    • 答案 2:

      首先,Monad不是和副作用相关的,看到楼上几位的回答,都是太着重副作用了。其实真正具有副作用的Monad只有IO一个,IO也只是借用Monad的接口实现了副作用,它的实现是与运行时相关的,毕竟是做IO,或者说,Monad为在纯函数式语言中实现IO等副作用提供了接口。而Maybe、State、Reader、Writer等Monad都是没有副作用的。 不能像理解对象那样去理解monad,把它当做一个实现两个接口的结构,对象是对现实事物的模拟,因此可以直观的去理解,而Monad是一种数学定义,没有直观的概念。 从定义上看,Monad就是两个接口,一个return一个bind,只要实现这两个操作的类型,都是monad。如果要直观一些,有两种直观点的概念,一个是当做数据的容器,比如Maybe这样的Monad,你可以用return把一个数据放进去,也可以用bind从一个操作拿出结果来放到新的容器中,或者说你可以对数据进行计算,但是不能拿出这个容器。这个相对是容易理解的。 另一个就是一种计算了,最典型的例子就是State了。State就是要规定计算的顺序,因此,在State Monad中存放的不是数据,而是一个计算,而 a1 >>= a2 就是将两个计算整合为一个计算,这个整合的过程会保证a1在a2之前运行,怎么保证的呢?bind,bind的作用就是先执行a1这个计算,并使用计算结果来执行a2这个计算。理解了这个,Monad就基本理解了。
    • 答案 3:

      我觉得monad其实就是把副作用包装成了一系列连续的函数操作:给定输入,就能产生一样的side effect(一样的函数操作)。这样就可以通过生成的函数的类型来确定函数执行顺序,或者把side effect通过函数的形式传递给下一个操作。这篇博客译文,把monad讲得挺清楚的。cnblogs.com/fzwudc...
    • 答案 4:

      这个文档比较给力,不过是要花不少时间的haskell.org/haskellw...这个讲范畴论与haskell,如果能看懂,也很帮助en.wikibooks.org/wiki...
    • 答案 5:

      v.youku.com/v_show... 这个是最好的一个解释了。来自 Channel 9。
    • 答案 6:

      费了半天力气做了无数的论文,终究说明了一个问题,原来赋值是表面上可以看不见的,原来顺序计算是可以表面上看起来像并行的。可是——冯诺依曼体系中,内存就是要存储和赋值啊;图灵机体系中,游标移动就是有顺序的啊。为什么一个简单的赋值号不用,必须用如此一串一串又一串的lambda代替一个“=”符号呢?我不管这东西数学上有多深刻。既然现实生活中物理学家一般不跑到建筑工程师的办公室嘲笑建筑师不懂建房子,所以请数学家们拜托回你们的办公室做头脑游戏,别到我们的产品会议上跟我们说我们不懂写程序,OK?

相关热词搜索:

上一篇:请问淘宝物流平台与京东物流平台有哪些区别呢?
下一篇:Android 平台有哪些好的游戏引擎?