【问题标题】:Haskell monads: What is the name for what `(>>=)` and `(=<<)` do?Haskell monads:`(>>=)` 和 `(=<<)` 的作用是什么?
【发布时间】:2014-01-10 21:40:50
【问题描述】:

我已经断断续续地玩 Haskell 好几年了;我对 monad 的工作方式、使用方法以及操作符 (=&lt;&lt;)(&gt;&gt;=) 所做的工作非常满意。

但我仍然不知道如何谈论他们!是否有任何标准术语来描述他们的工作——将箭头a -&gt; m b 转换为箭头m a -&gt; m b

(作为一个数学家背景,想到的一个选项是“来自 Kleisli 范畴的健忘函子”。但是 Haskell 大师肯定有一些更简洁的术语,因为在 Haskell 中,这个操作被用作monad 的构建块,不像在数学环境中它通常被认为是派生运算,由乘法和函数定义!)

【问题讨论】:

  • &gt;&gt;= 的通用术语是bind,因为这在 Wadler 的 函数式编程的本质 论文中使用,该论文在 Haskell 中介绍了它们(不确定该术语是否在此之前使用过)。
  • 啊,非常感谢!如果你这样回答,我会接受的。
  • 实际上,随着 Haskell 不断巩固其进行类别理论的方式,有一种趋势是从 join 而不是 &gt;&gt;= 开始。但可以肯定的是,bind 在大多数实际应用中更方便。

标签: haskell monads


【解决方案1】:

&gt;&gt;= 的正式名称是 bind。我们也可以将其解读为“feed through”、“process by”等。Brian Benkman from MSDN's Channel 9 称其为“shove”(向右或向左)。

为什么要绑定?类推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 ->
   ....                    .... ))

正如您所见,这是从完全非数学的、实用的角度来看的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多