原来大家都潜水。选个话题:什么是Monad?

38 views
Skip to first unread message

Albert Lee

unread,
Mar 29, 2010, 1:27:54 AM3/29/10
to haskell.cn
各抒己见了,如果一个新接触Haskell的人来问:什么是Monad,应该怎么跟他解释? 各位心中对它又是怎么理解?

黄毅

unread,
Mar 29, 2010, 1:32:11 AM3/29/10
to haskellcn
俺自己就是新接触Haskell的人,我说说自己的理解吧,Monad本身就是那几个接口,bind 方法的目的就是让操作能顺序执行,而且可以配合
do 的语法糖,写出类似命令式的语句。
IO的实现,haskell应该就是在IO类型的bind方法的具体实现中进行底层的IO操作。

请各位指正。

2010/3/29 Albert Lee <hanzh...@gmail.com>:


> 各抒己见了,如果一个新接触Haskell的人来问:什么是Monad,应该怎么跟他解释? 各位心中对它又是怎么理解?
>

> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“haskell.cn”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 hask...@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 haskellcn+...@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/haskellcn?hl=zh-CN 访问此网上论坛。
>
>

--
http://codeplayer.blogspot.com/

Jack

unread,
Mar 29, 2010, 1:37:26 AM3/29/10
to haskell.cn
一个不绕圈的解释

http://learnyouahaskell.com/functors-applicative-functors-and-monoids

On 3月29日, 下午1时32分, 黄毅 <yi.codepla...@gmail.com> wrote:
> 俺自己就是新接触Haskell的人,我说说自己的理解吧,Monad本身就是那几个接口,bind 方法的目的就是让操作能顺序执行,而且可以配合
> do 的语法糖,写出类似命令式的语句。
> IO的实现,haskell应该就是在IO类型的bind方法的具体实现中进行底层的IO操作。
>
> 请各位指正。
>

> 2010/3/29 Albert Lee <hanzhup...@gmail.com>:

Albert Lee

unread,
Mar 29, 2010, 1:40:55 AM3/29/10
to haskell.cn
我的粗浅理解: Monad是一组接口规则, 用来解决纯函数与非纯函数的隔离。不同的 monad 用来实现不同的计算结构,比如 IO, 读写全局
值,异常,延续等。

一个程序块,如果需要多种特性,就把多种 Monad 叠加在一起,这就是 Monad Transformer,就像一个洋葱,一层层的。

在实际开发中,需要用什么特性就组合什么特性,没有显式使用的特性就不能用。通过这种方式,把很多不同的层面的东西有机安全的组装在一起。

On Mar 29, 1:32 pm, 黄毅 <yi.codepla...@gmail.com> wrote:
> 俺自己就是新接触Haskell的人,我说说自己的理解吧,Monad本身就是那几个接口,bind 方法的目的就是让操作能顺序执行,而且可以配合
> do 的语法糖,写出类似命令式的语句。
> IO的实现,haskell应该就是在IO类型的bind方法的具体实现中进行底层的IO操作。
>
> 请各位指正。
>

> 2010/3/29 Albert Lee <hanzhup...@gmail.com>:

黄毅

unread,
Mar 29, 2010, 6:12:40 AM3/29/10
to haskellcn
2010/3/29 Jack <jac...@gmail.com>:
> 一个不绕圈的解释
>
> http://learnyouahaskell.com/functors-applicative-functors-and-monoids

functor和applicative讲得挺好,但是似乎还没讲到monad

>
> On 3月29日, 下午1时32分, 黄毅 <yi.codepla...@gmail.com> wrote:
>> 俺自己就是新接触Haskell的人,我说说自己的理解吧,Monad本身就是那几个接口,bind 方法的目的就是让操作能顺序执行,而且可以配合
>> do 的语法糖,写出类似命令式的语句。
>> IO的实现,haskell应该就是在IO类型的bind方法的具体实现中进行底层的IO操作。
>>
>> 请各位指正。
>>
>> 2010/3/29 Albert Lee <hanzhup...@gmail.com>:
>>
>> > 各抒己见了,如果一个新接触Haskell的人来问:什么是Monad,应该怎么跟他解释? 各位心中对它又是怎么理解?
>>
>> > --
>> > 您收到此邮件是因为您订阅了 Google 网上论坛的“haskell.cn”论坛。
>> > 要向此网上论坛发帖,请发送电子邮件至 hask...@googlegroups.com
>> > 要取消订阅此网上论坛,请发送电子邮件至 haskellcn+...@googlegroups.com
>> > 若有更多问题,请通过http://groups.google.com/group/haskellcn?hl=zh-CN访问此网上论坛。
>>
>> --http://codeplayer.blogspot.com/
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“haskell.cn”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 hask...@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 haskellcn+...@googlegroups.com

Jack,Shen

unread,
Mar 29, 2010, 6:49:17 AM3/29/10
to hask...@googlegroups.com
我觉得LYH里面的context比喻得不错
如果按照这个比喻,我对 monad 的理解 就是定义context,以及context之间转换的方法,或context中的局部变量

StateT 就用于定义一个在这个context中的局部变量。

lift , liftM 等就是context之间的转换方法。

多层context之间的转换不同的monad(处于中间层的) 有不同的默认的(可修改的)转换(穿透)行为。

2010/3/29 黄毅 <yi.cod...@gmail.com>

Wensheng

unread,
Mar 29, 2010, 4:04:19 PM3/29/10
to haskell.cn
我也不是太明白。不过听说最好是不用管它什么是monad, 用就是了,用一阵子就明白了。

这里吧IO monad 和 unix shell 比较,比如 haskell 的a >>= b就好象shell的a|b
http://okmij.org/ftp/Computation/monadic-shell.html

这里说jquery就是个monad, 懂javascript的可看一下:
http://importantshock.wordpress.com/2009/01/18/jquery-is-a-monad/

还有:
http://www.haskell.org/haskellwiki/Monads_as_computation

Reply all
Reply to author
Forward
0 new messages