【问题标题】:Why is "bind" written as >>= in Haskell Monads?为什么“绑定”在 Haskell Monads 中写为 >>=?
【发布时间】:2014-05-30 09:57:34
【问题描述】:

Haskell Monads 中语法“>>=”和“>>”的起源是什么?我不是在寻找关于 Monads 如何工作的解释,而是为什么语言设计者选择了这种语法。对我来说,“>>=”和“>>”似乎有点武断,从来没有直观的意义。有人有直观的解释吗?是来自范畴论的语法吗?

【问题讨论】:

  • 语法糖有人吗?
  • Haskell 中的运算符并不是真正的糖;它们只是函数名。
  • 不是真的,这只是名字的选择。
  • 我认为它只是“有点像箭头,还没有被拿走”(尽管在这种情况下=>> 可能是一个更自然的选择)。

标签: haskell monads


【解决方案1】:

m >>= k 建议“将计算结果m 提供给函数k”; m >> n 建议“运行m 计算,然后运行n 计算”。

【讨论】:

  • 如果我没记错的话,>>= 符号显然是 Haskell 徽标的一部分。其中 lambda 是第二个 >。 :D
  • @CommuSoft 是的,但是徽标相对较新。它在 2009 年被选中。Haskell 1.0 于 1990 年发布,甚至没有 monad。它们是从 1996 年开始在 Haskell 1.3 中引入的。所以徽标当然不是​​选择名称的原因。恰恰相反。 Monads 被视为 Haskell 的一个重要特性,而 bind 的语法选择对于 Haskell 来说是相当独特的,因此它现在反映在它的 logo 中。
  • 这个答案对应于我目前的心理模型,但>> 部分对我来说没有任何意义。 >>=>= 建议使用某种管道,因此 |= 更适合作为运算符来表示删除上下文的左侧部分。我真的很想获得一些链接(到邮件列表?),在那里他们讨论是什么促使他们使用这些运算符,希望为这些运算符建立一个健全的心理模型。
  • @Sebastian 如果只是关于管道功能组合就足够了。 g . f $ xx 发送到由fg 创建的管道,按此顺序。对于 monads(以及,部分不同的方式,还有 functors 和 applicatives),起作用的是值和它们可以在其中的 context 之间的区别。>> 丢弃值,但不是他们的背景。举例说明:Just 1 >> Just 2 显示 1 被丢弃,Nothing >> Just 2 显示影响最终结果的第一个参数的上下文(在本例中为 Just 和 `Nothing 之间的选择)。
  • @Sebastian 我们必须记住,最初将 monads 引入 Haskell 的是 I/O,在这种情况下,>> 的意思是然后,就像在命令式排序中一样,匹配直觉。这个想法比这更精确和通用,这要归功于鸟瞰将 monad 作为各种命令式语义的功能实现。推荐阅读:Wadler's papers on monadsA History of Haskell: being lazy with class 了解历史背景。
猜你喜欢
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多