延续可以说是单子吗?它们是 monad 的子集还是仅仅是实现 monad 的一种方式?
编辑:或者也许我弄错了,单子是一个比延续更抽象的概念?(所以我真的在这里比较苹果和橘子)
延续可以说是单子吗?它们是 monad 的子集还是仅仅是实现 monad 的一种方式?
编辑:或者也许我弄错了,单子是一个比延续更抽象的概念?(所以我真的在这里比较苹果和橘子)
不仅是延续单子,而且它们是一种通用单子,从某种意义上说,如果你有延续和状态,你可以模拟任何功能单子。这一令人印象深刻但技术含量高的成果来自于Andrzej Filinski令人印象深刻且技术含量高的思想,他在 1994 年左右写道:
我们表明,任何单元和扩展操作可表示为纯函数术语的 monad 都可以嵌入到具有“可组合延续”的按值调用语言中。
简而言之,由于 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
他们可以是,虽然他们不需要。我会稍微扭转你的问题,而是说单子是一种实现延续的方式。但是您可以通过多种方式实现延续——例如,您可以在 C# 中对 CPS 进行适度但受限的复制,而无需太多努力。查看Haskell 网站上的 The Continuation Monad进行非常彻底的处理。
延续是程序中的特定功能。Monad 是类型构造函数。
Cont<T>
用于延续类型的类型构造函数T
不会是 monad。
然而,Cont<Cont<T>>
是一个单子,这就是通常所说的“延续单子”。
(在一种语言中使用 callcc 就相当于能够从 转换Cont<Cont<T>>
为T
。)