17

延续可以说是单子吗?它们是 monad 的子集还是仅仅是实现 monad 的一种方式?

编辑:或者也许我弄错了,单子是一个比延续更抽象的概念?(所以我真的在这里比较苹果和橘子)

4

4 回答 4

24

不仅是延续单子,而且它们是一种通用单子,从某种意义上说,如果你有延续和状态,你可以模拟任何功能单子。这一令人印象深刻但技术含量高的成果来自于Andrzej Filinski令人印象深刻且技术含量高的思想,他在 1994 年左右写道:

我们表明,任何单元和扩展操作可表示为纯函数术语的 monad 都可以嵌入到具有“可组合延续”的按值调用语言中。

于 2009-03-20T22:58:50.803 回答
18

简而言之,由于 monad 的“绑定”将有效的延续(“其余计算”的 lambda)作为参数,因此 monad 在这个意义上是延续。另一方面,可以使用单子语法糖在非 CPS 语言中有效地实现延续传递样式,如下面的一些杂项链接所建议的那样。

来自 Haskell 的“所有关于 monads”的教程:

https://www.haskell.org/haskellwiki/All_About_Monads#The_Continuation_monad

一个 F# continuation monad,用于实现 for 样式循环的“break”和“continue”

http://cs.hubfs.net/forums/thread/9311.aspx

以及将延续单子应用于 F# 中的问题的示例:

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!256.entry

于 2009-03-20T13:29:19.643 回答
6

他们可以是,虽然他们不需要。我会稍微扭转你的问题,而是说单子是一种实现延续的方式。但是您可以通过多种方式实现延续——例如,您可以在 C# 中对 CPS 进行适度但受限的复制,而无需太多努力查看Haskell 网站上的 The Continuation Monad进行非常彻底的处理。

于 2009-03-20T13:28:42.063 回答
1

延续是程序中的特定功能。Monad 是类型构造函数。

Cont<T>用于延续类型的类型构造函数T不会是 monad。

然而,Cont<Cont<T>>是一个单子,这就是通常所说的“延续单子”。

(在一种语言中使用 callcc 就相当于能够从 转换Cont<Cont<T>>T。)

于 2010-08-05T08:17:56.167 回答