【发布时间】:2019-12-13 03:31:40
【问题描述】:
在支持延续的语言中,例如Scheme、Ruby 和 Haskell,假设有一个函数 cc',它不接受任何参数并返回当前的延续,因此通过调用 cc' 获得延续的调用者可以在任何地方调用延续,只要它喜欢.
cc' 可以写成 CPS 风格的 call/cc,通过将标识函数作为参数传递给 call/cc。
相反,CPS 风格的 call/cc 可以写成非 CPS 风格的 cc' 吗?
【问题讨论】:
-
call/cc(f) = f(cc)? -
@rampion 这很直观,但错误(AFAICS)。这会导致
g(call/cc(f)) = g(f(cc)) = call/cc(g . f),其中最后一个.表示函数组合,这显然不是我们想要的。关键是,直观地说,f应该接收“没有f本身”的延续,而f(cc)在延续中包含f。 -
Haskell 不原生支持延续。可以在语言中实现定界延续(例如,
ContT rmonad 转换器和各种 CPSish 事物,如Codensity),但不支持像 Scheme 那样的未定界延续。
标签: ruby haskell scheme continuations continuation-passing