冒号老师谈Monad

那天就Monad的问题向冒号老师请教,下面是他的答复,与大家共享:

关于monad实现I/O的问题,Haskell有专门的I/O库,包括readFile,writeFile,getChar,putChar等函数,

具体由编译器执行。在C#或F#中的情形我不太熟悉,相信原理是一样的。

至于monad,它是函数式编程中最抽象的一个概念,事实上相应的数学概念(属于抽象代数中的范畴学)
即使在数学中也是相当抽象的。当年读数学系研究生时,我也是费了一番功夫才理解范畴的概念。
后来改行到计算机,才发现范畴与程序语言中的类型系统是相对应的,当然后者简单得多,也容易理解得多。

具体到monad,在数学上过于抽象,我只想用自己的语言简单表达一下它在函数式编程中的意义。
monad是一种特殊的函数,(准确地说,是一种函子functor)它比一般的函数多了一个可合并的运算。
该运算可能是有副作用的,不妨认为是一个有记忆的状态机。
它是各种行为(此处行为区别于计算的地方在于可能有副作用,比如I/O运算)的叠加。
例如:在unix中的I/O管道(pipe)便是一系列I/O运算的叠加,haskell中Monad的bind符号>>=便相当于管道符号"|"。

换言之,Monad把一个计算过程分成两部分:函数式风格的计算与命令式编程风格的计算。
其中后者以类似回调的机制来嵌入到前者。也可以理解为,monad除了有与一般函数相同功用的返回值外,
还多了一个副作用的表示结构,该副作用可以累积叠加,一直传播下去。
这样的好处是既保证了函数式编程的纯洁性,又达到了改变状态的目的。

以上只是本人粗浅的看法,毕竟我对于monad的理解仅限于学术上,并没有真正用于企业级的实践。
希望能对你有一些帮助。
稍微学术的说法可以参考: http://en.wikibooks.org/wiki/Haskell/Category_theory

posted on 2009-03-03 15:01  Todd Wei  阅读(7224)  评论(2编辑  收藏  举报