Haskell单子:`(>>=)`和`(=<<)`的名称是什么?

9

我已经断断续续地使用Haskell数年了;我对单子是如何工作的,以及如何使用它们,以及操作符(=<<)(>>=)做什么感到非常舒适。

但我仍然不知道如何“谈论”它们!有没有什么标准术语来描述它们所做的事情-将箭头a -> m b变换成箭头m a -> m b的动作?

(作为一个数学家,我想到的一个选择是“Kleisli类别中的遗忘函子”。但是Haskell大师们肯定有更简洁的术语,因为在Haskell中,这个操作被用作单子的构建块之一,而在数学环境中,它通常被认为是一个衍生操作,从乘法和函子性定义而来!)


6
在引入Haskell中的>>=运算符时,Wadler在他的论文《函数式编程的本质》中使用了术语“bind”,这个术语是>>=的通用术语(不确定该术语在此之前是否被使用过)。请注意,我已经将原文中提到的英文术语"bind"翻译成了中文。 - Mark H
非常感谢!如果你把那个作为答案,我会接受它。 - PLL
实际上,随着Haskell不断巩固其范畴论的处理方式,越来越多的人开始从join而非>>=开始。但是,在大多数实际应用中,“绑定”更加方便。 - leftaroundabout
1
可能是Are there pronouncable names for common Haskell operators?的重复问题。 - not my job
这个回答解决了你的问题吗?常见的Haskell运算符有可读的名称吗? - cigien
1个回答

9
官方名称为>>=的操作符是绑定(bind)。我们也可以称其为“通过”、“处理”等。MSDN的Channel 9的Brian Benkman将其称为“推”(向右或向左)。
为什么叫绑定?类比于let。正如let将其变量绑定到初始表达式的评估结果一样,“单子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 ->
   ....                    .... ))

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接