我已经和Haskell一起玩了好几年了; 我对monad如何工作,如何使用它们以及操作员(=<<)
和(>>=)
做什么感到很满意.
但我还是不知道如何谈论它们!对于他们的工作是否有任何标准术语 - 将箭头a -> m b
转换为箭头的动作m a -> m b
?
(作为背景的数学家,脑海中浮现的一个选项是"来自Kleisli类别的遗忘函子".但是Haskell大师肯定会有一些更简洁的术语,因为在Haskell中,这个操作被用作其中一个构建块. monads,与通常被认为是派生操作的数学设置不同,从乘法和functoriality定义!)
正式名称>>=
是bind.我们还可以将其视为"直通","处理方式"等.来自MSDN频道9的Brian Benkman将其称为"推"(向右或向左).
为何绑定?通过类比let
.正如let
将其变量绑定到评估初始表达式的结果一样,"monadic let"会将其变量"绑定"到其输入计算的结果:
let a = .... or: .... $>> (\ a -> -- non-recursive "let", as in Lisp,
b = .... .... $>> (\ b -> -- (Haskell's is Lisp's "letrec")
in .... .... )) where x $>> f = f x
do a <- .... or: .... >>= (\ a ->
b <- .... .... >>= (\ b ->
.... .... ))
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这是完全非数学的,实用的观点.