monad的引入个人感觉效果不是太好。
如果可以先介绍monad的数学定义,之后介绍Haskell中的定义monad的方法,并讨论这两种定义之间的联系(如通过return/join/fmap定义monad和通过return/bind(>>=)定义monad这两种方法之间的等价性),然后再通过大量的例子来展示monad在haskell编程中的实际使用方法,特别是do block的运用,可能效果会更好一点。
当然,如果能在引入monad之前,利用上述类似的方法,引入functor,natural transformation,(甚至,我个人觉得,为了让monad的概念更清晰,应该在引入functor之前,引入category的定义),这样效果可能更好一点。虽然对这些概念的理解不是理解Haskell中monad的充分条件,但却可以有效地消除诸如“为什么Haskell中的monad要这样定义”的烦躁情绪。
这里,我给出一个wikibook上介绍Haskell中用到的category theory基础的链接,可以作为阅读过程中帮助理解的一个参考。当然,最有效的方法,还是自己反复思考,以提炼出自己的理解
https://en.wikibooks.org/wiki/Haskell/Category_theory
如果非得按照书中引入monad的方式来理解monad,我的感觉是,强迫自己反复思考monad和do block之间的相互转换,可能会是一个比较好方法。详细内容可以参考书中do notation这一章节
插图非常漂亮,写作的手法也很生动,有很多梗在里面,尤其是最后几章关于monad的章节命名,喜欢克林伊斯特伍德的朋友应该会有会心一笑 :)
但是,最后一章读完,是书没写完的感脚啊。。。