译注:
学习haskell超过一年了,还是对monad一头雾水,人家说如果能把monad完全讲明白可以去当大学教授了。人家还说翻译是最好的学习。所以我就开始翻译这篇经典的monad教程。行文较为粗放,谬误在所难免,望读者指正。
Haskell monadic编程理论与实践指导
原文地址: http://www.haskell.org/all_about_monads/html/index.html
这份教程目标在于给初学及中等水平的Haskell程序员一个简单的方式解释monad的概念和其在函数式编程中的应用。需要先熟悉haskell语法,但对monad没有预先要求。教程涵盖了非常多的内容,后面的部分需要对前面的内容有完整的理解。提供很多代码例子用来演示monadic编程。不建议试图一次读完。(译注:读很多次都不一定够……)
教程分三部分。第一部分给出对monad在函数式编程中所扮演的角色的一个基本理解,解释了它是什么,如何操作,如何声明和如何在 haskell中使用。第二部分包括了Haskell中的每一个标准monad,给出其声明并讨论其应用。第三部分包括一些transformer相关的高级内容, 以及实际编程中会遇到一些问题。
要实际理解monad最好的办法是实际试验一些monadic的代码。这份教程包含了很多例子代码,涵盖了简单到适度复杂的例子,读者最好去研究把玩并修改他们。不幸的是,起先的例子有必要故意设计的不去组合多个monad。如果你觉得这样有些麻烦,可以提前刊第三部分来学习如何解决。
Comments
后面的翻译
翻译到这里,第一部分基本上算结束了,还有一个练习章节和一个 haskell中对monad的支持函数列表的章节,翻起来也没什么意思,读者看了也作用不大。暂且跳过,准备攻坚第二部分中的 State 及 continuation 和第三部分。
发到python列表zhogn的邮件
虽然 Monad 的概念在haskell中具有重要的地位,但它并不局限在 haskell中,实际上它是一个很通用的概念。所以发到这里。
要解释清楚 Monad 是什么实在不是一件容易的事情,实际上我也还晕晕的,因此才开始翻译这篇monad的教程,主要为自己学习之用。相信这是国内很少的介绍
monad的中文资料。
monad是什么呢? 粗略的可以认为它类似于一种"设计模式" , 是对计算过程的组合的策略的一种抽象机制。(这个说法确实是够抽象的)
就像 OOP 是对数据的组合的策略的抽象,Monad可以看作是对计算过程的抽象。数据是有形的,而计算的过程则是抽象的。对抽象的东西进行抽象,结果就是更加抽象……
monad是把一些计算过程的共同特征抽取出来放到一个单独的地方,进行统一的处理,这样就不会分散在程序的各处,而且,monad描述的计算过程是可以组合的,这样基本的计算过程可以组合成复杂的过程。
举例:有一类计算有可能返回一个值,也可能计算失败,什么都不返回。 为了描述这一类计算过程,用 Maybe 这个 monad
来抽象,也可以说是用了 Maybe 这个设计模式
data Maybe a = Nothing | Just a
一种计算可能返回某种类型的值,用 Just a 表示,也可能什么都不返回 Nothing.
monad的威力在于组合,如果有一串可能会失败的计算,那么可以把他们串起来(具体的例子,看我的翻译)
。。。
Monad可以作为容器,可以做parser,可以表示非确定性计算,可以隔离"副作用"与纯函数,可以作为IO,等等
monad确实不少三言两语说清楚的,很多次我以为自己有些明白了,马上就又会被搞糊涂。
不过这确实是一个很值得了解的东西