我所理解的monad(0)

以前在别人的一篇blog里看到过有这样一句话,大意是:关于monad,几乎每个在学习函数式编程中接触到这个模式的,都会写一篇博客描述他的理解。而且不同的人对monad的理解有所不同(暗讽monad的复杂)。

我也不例外,大约是3年前刚接触scala时,无意搜到了james的《monads are elephants》,一下子把我给难住了。scala在刚开始学习时,如果只把它当作java的替代者来用,继续用OO的范式的话,并不难。但在继续深入它的类型和函数式特征之后,发现有一篇广袤的世界是之前不曾看到的,可以以一种新的视角来思考编程的本质。而scala在OO与”新世界”之间架起一座桥(Bridge to Terabithia),通过这座桥的一个代价是,抛弃原先认为编程理所当然应该这样的观念。

在新的世界同样有设计模式,不过它们抽象的角度不同。理解起来有些困难,最大的原因是缺乏对这个新世界的认识,具体的说scala里最显著困难是它的类型系统,当类型的抽象度变高之后(犹如从二维世界到三维世界),它的含义和使用场景也会复杂很多。而monad正是基于高阶类型做的抽象。所以在了解monad前一定先要了解scala中高阶类型的概念,这块可以参考我blog中的scala类型系统系列。

通常monad也是一个标识,判断程序员对函数式世界的了解程度,它背后隐藏着很多的概念,并且很多来自数论(范畴领域),对于非科班出身的我来说,总是心存敬畏而避而远之,但我们如果去掉这些理论描述,仅从程序的实现来看,还是比较容易的,只要把这些概念一点点分解开的话。

在james的这篇 A Brief, Incomplete, and Mostly Wrong History of Programming Languages,(译文参考这里:程序语言简史(伪) ),有段关于monad的描述很有意思:

Haskell由于使用了Monad这种较费解的概念来控制副作用而遭到了一些批评意见。Wadler试图平息这些质疑,他解释说:“一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已,这有什么难以理解的?”

我们就从这句话说起,先理解是“幺半群”,别被这个字面术语吓到,其实用程序表达起来很简单。

我所理解的monad(0)》上有6条评论

    1. 代数

      范畴论的基础是抽象代数,数论也会用到抽象代数,但范畴论和数论本身的关系并不大

      回复
      1. hongjiang 文章作者

        谢谢解释,今天正好看到知乎有个问题有关“数理逻辑与范畴论的关系”:https://www.zhihu.com/question/37050853 有兴趣的可以去看看

        回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注