计算表达式与monad相同吗?


22

我仍在学习函数式编程(使用f#),最近我开始阅读有关计算表达式的文章。我仍然不完全理解这个概念,而让我不确定阅读所有有关monad的文章(其中大部分是基于Haskell撰写的)时,我不确定的是计算表达式和monad之间的关系。

写下所有内容后,这是我的问题(实际上是两个问题):

每个F#计算表达式都是monad吗?每个单子都能用F#计算表达式表示吗?

我已经读过Tomas Petricek的这篇文章,如果我对它的理解很好,它指出计算表达式比monad还要多,但是我不确定我是否正确解释了这一点。


@Raphael请问删除lang标签的原因是什么?
2014年

2
由于我们关心概念,因此我们在这里尽量使大多数事情与语言无关。我不知道删除F#对问题有什么作用(认为如果重要的是F#,那么这里的问题就不重要了,但这是一个临界情况),所以我只删除了F#标签。经验法则:F#不是CS概念,因此它不需要标签。(是的,我知道其他PL标签,我也不喜欢它们。对于某些问题,社区决定对这些PL标签进行担保。)
Raphael

1
@Raphael我相信这个问题确实是一个边缘情况。有人决定将其迁移到这里,但似乎在这里也有点偏离主题。自此以来,问题本身就是一台计算机,但同时答案和问题都与f#有关。我了解您的经验法则,感谢您的澄清。
2014年

Answers:


22

首先,计算表达式是一种语言功能,而单子表达式是数学抽象,因此从这个角度来看,它们是完全不同的东西

但这不是一个非常有用的答案:-)。计算表达式是一种语言功能,可为您提供一种语法,该语法可用于具有一元结构的计算(或数据类型)编程,但也可与其他结构一起使用。您可以阅读我的F#计算表达式动物园文章,以了解更多详细信息,但计算表达式可用于:

  • Monad,也可以是加法Monad(Haskellers称为MonadPlusMonadOr
  • 组合计算(Haskeller将其称为monad变压器)
  • 一元计算,但支持其他F#构造(例如异常处理)的计算
  • Monoid(以及没有Monadic绑定的几个变体)
  • 适用函子(尽管仅在研究扩展中实现)

因此,计算表达式当然与monad紧密联系,但与它们之间的联系并不紧密。这与例如Haskell的do表示法形成对比,后者与monad有更紧密的联系(尽管即使在数学上不是严格的monad的计算中也可以使用)。


3
Monad转换器是将一个monad转换为另一monad的通用方法-F#计算表达式仅真正支持直接实现该转换的/ result /,而不支持转换本身。
GS-向Monica道歉(2014年

1
@GaneshSittampalam-是的,您是正确的。我试图简化的尝试在这里不是很有用:-)。计算表达式可以为您提供一种用于计算的语法,该语法是应用monad转换器的结果(底层monad和所组成的monad可能具有不同的语法)
Tomas Petricek

5

您可以使用计算表达式来表示单子。有一个例子在这里。另外,正如您所指出的,您可以使用计算表达式而不仅仅是单子表达式。关于它们之间的区别,这里有扩展的解释。这里没有足够的空间来正确解释这些区别,但是计算表达式与monad的不同之处在于它们可以重用常规的F#语法并可以添加其他抽象。局限性在于它写的计算表达式在计算类型上是多态的,这是非惯常的(而且很困难)。


1
请至少总结您链接到的页面上的内容,以使答案更加独立。如果两个链接停止工作,您当前的答案将完全没有意义。
David Richerby 2014年

2
我不确定你在说什么。我明确回答了问题,然后在询问者感兴趣的情况下提供了指向更多信息的链接。不需要链接即可回答问题。
2014年

1
我什至无法想象这两个链接永远都无法停止工作:-)
Tomas Petricek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.