【发布时间】:2014-11-15 04:58:07
【问题描述】:
我开始怀疑我是否真的理解这个话题。
到目前为止,我一直将延续理解为调用带有闭包的函数(通常由另一个函数返回)。但是MLton seems to have a non‑standard special structure for this(我不确定理解的结构)以及在其他一些文档中,提到了特殊优化(using jumps,如第 58 页快速提到的,印刷第 51 页)带有延续,即,而不是命名调用带有闭包的函数。此外,函数闭包似乎有时被描述为延续的基础,但没有被描述为延续,而在其他时候人们断言相反(函数闭包是延续的特例,而不是其他方式)。
作为一个例子,延续与此有何不同,什么看起来相同,使用延续而不是带有闭包的函数:
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”相同,但阅读此问题并没有回答我的问题,也没有以实际案例为基础。除了它驱使我添加另一个问题:为什么说延续比闭包更抽象,如果最终延续是由闭包组成的,正如上面链接中不完整的(在我看来)答案所暗示的那样?
区别真的很重要还是只是风格/语法/词汇的问题?
我觉得 monads 与 continuations 会出现类似的问题,但这对于单个问题帖子来说太多了(但如果相反,可以在此期间简单地回答,请随意......)。
更新
仍然来自 MLton 的世界,似乎暗示延续和函数闭包的措辞是相同的(除非我没有正确理解)。
CommonArg (mlton.org),靠近页面底部,说:
我认为常见的参数优化表明 支配者分析比审稿人说的要好一些: 我们发现的不仅仅是恒定的延续,我们还发现常见 继续。我认为这进一步证明了这一事实 我观察到的共同论点消除了一些 env_X 论点 这似乎对应于确定虽然 正在执行的闭包不是恒定的,它至少与 闭包被传递在别处。
这两个词都在说同一个词,不是吗?
类似并且可能更明确,在此页面的底部:ReturnStatement (mlton.org)。
那里也一样,好像也一样。是吗?
【问题讨论】:
标签: closures sml ml continuations lambda-calculus