【问题标题】:Function closure versus continuation, in general and SML函数闭包与延续,一般和 SML
【发布时间】: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


    【解决方案1】:

    似乎存在术语混乱。 'Continuation'是一个抽象概念,它是一个表达式的上下文的含义。闭包是一种非常特殊的实现方式 代表函数的值(高阶语言可以在没有闭包的情况下实现,例如,使用替换语义)。

    控制运算符可以捕获当前的延续并产生它的特定表示(这称为具体化)。捕获的延续的特定表示可能确实是一个闭包——也可能不是。例如,在 OCaml 中,delimcc 库捕获的延续被表示为抽象数据类型的值(其实现与闭包完全不同)。您可能会发现下一页的介绍部分很有用。 Undelimited continuations are not functions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 2012-03-15
      • 2018-03-19
      • 1970-01-01
      相关资源
      最近更新 更多