我开始怀疑我是否真的理解这个话题。
到目前为止,我理解一个继续作为一个带闭包的函数(通常由另一个函数返回)。但是MLton seems to have a non‑standard special structure for this(我不确定的结构),以及其他一些文件中,提到了特殊的优化(using jumps,如第58页快速提到的,打印第51页),即延续,即而不是命令调用带闭包的函数。此外,函数闭包似乎有时被描述为延续的基础,但不被描述为延续,而有些时候人们断言相反(函数闭包是延续的特殊情况,而不是其他方式)。
作为一个例子,continuation如何与此不同,看起来是什么样的,使用continuation而不是带闭包的函数:
datatype next = Next of (unit -> next)
fun f (i:int): next =
(print (Int.toString i);
Next (fn () => f (i + 1)))
val Next g = f 1
val Next g = g ()
val Next g = g ()
val Next g = g ()
…
我想知道,在一般的计算机科学背景下,特别是在实际的SML环境中。
注意:该问题可能与“difference between closures and continuations”看起来相同,但阅读本问题并未回答我的问题,也没有将实际案例作为依据。除了它驱使我添加另一个问题:为什么延续被认为比闭包更抽象,如果最终延续由闭包构成,因为上述链接中的不完整(我的眼睛)答案表明?
差异真的很重要还是只是风格/语法/词汇的问题?
我觉得类似的问题出现在monad与continuation之间,但对于一个问题帖子来说这个问题太多了(但如果恰恰相反,那可以简单地回答一下,感觉自由......)。
仍然来自MLton的世界,似乎暗示延续和功能闭合的措辞是相同的(除非我没有正确理解)。
页面底部附近的我认为通用论证优化显示的是 支配者分析确实略好于评论者所说: 我们发现不断延续,我们发现常见 延续即可。而且我认为事实进一步证明了这一点 我观察到共同的论点消除了一些env_X参数 这似乎对应于确定,而 正在执行的闭包不是常数,它至少是相同的 关闭在其他地方传递。
用两个词说的都是一样的,不是吗?
同样地,可能更明确地,在此页面的底部:ReturnStatement (mlton.org)。
也有,似乎是一样的。是吗?
答案 0 :(得分:2)
似乎存在术语混淆。 “延续”是一个抽象概念,它是表达语境的意义。关闭是一种非常特殊的实现方式 表示函数的值(高阶语言可以在没有闭包的情况下实现,例如,使用替换语义)。
控制操作符可以捕获当前延续并生成它的特定表示(这称为reification)。捕获的延续的特定表示可能确实是一个闭包 - 或者可能不是。例如,在OCaml中,delimcc库捕获的continuation被重新读取为抽象数据类型的值(其实现与闭包完全不同)。您可能会发现以下页面的介绍部分很有用。 Undelimited continuations are not functions