【问题标题】:What are modern continuation operators all about? [closed]现代延续运算符到底是什么? [关闭]
【发布时间】:2021-10-27 00:46:27
【问题描述】:

过去,我以为我理解call/cc。这些天来,我看到更多关于“定界”延续运算符的引用,它们似乎成对出现,例如 shift/resetprompt/control,有时甚至更奇特。但是我还没有看到任何基础知识的明确解释,所以

  1. 他们是做什么的?
  2. 它们有什么用?
  3. 在特定语言/上下文/目的方面,一组运算符比另一组更好?

【问题讨论】:

  • 关于这个主题的文章大约有一千页on Oleg's website 可以帮助您入门。
  • @DanielWagner,我之前确实遇到过这种情况,但不知道从哪里开始。有什么建议吗?
  • 我将从标有“介绍”的那个开始。 (截至撰写本文时,这唯一标识了那里的一篇文章。)
  • 我想对这个话题感兴趣的每个人都知道 Oleg 在他的网站上的精彩部分。但是一个更有条理、更容​​易理解的总结会很有帮助。我会发现如何使用分隔的 conts 来实现代数效果特别有趣。这可能会对它们的总体工作方式有所了解。
  • @alinsoar 我不确定我是否同意这个问题被关闭(尽管子问题 3 可能太宽泛了,是的)。但并不要求 SO 适合所有问题; “我对这个问题很感兴趣,所以如果 SO 规则不允许,则应该重新制定规则”并不是一个很好的论点。

标签: haskell functional-programming scheme continuations delimited-continuations


【解决方案1】:

我已经阅读了几篇文章,我可以解释这个想法。所以我不知道如何实现它以及如何实际使用它,但我理解了主要思想。

假设你有这样的电话

 (f (h (g x)) 2)
^     << scheme undelimited cont. captures from here 

g 捕获延续。

  1. 在scheme中,如果你在g中调用call/cc,它将从顶层开始复制所有的执行堆栈(从f被调用的地方开始)——以防你有很多表达式在顶层,每个人都有自己的 stacklet,调用保存的延续将在顶层停止(因此,在上面的表达式中,它将在 f 之后停止,此时它的值为 f)。

  2. 如果您希望从g 内部到h 的退出点捕获延续,并且每次调用延续以将值返回给f,则从该点开始捕获堆栈就足够了h 的调用,而不是 f 调用的完整 stacklet,因此您想告诉系统调用类似 call/cc 的函数不要从顶层复制其余计算,而是从给定的点,并在该点每次返回一个值:

    (f (h (g x)) 2)
    
       ^        << delimited cont. captures from here 
    

    在这种情况下,您可以检测系统,例如:

    (f (shift (h (g x)) 2))
    

    并在g 中调用reset,在您需要捕获延续的地方。

  3. 定界延续可以通过无定界延续来模拟,但我认为在某些情况下能够使用定界更实际。因此,您不能以仅在感兴趣区域中复制堆栈的实用方式在方案中执行此操作,它迫使您复制完整的堆栈(我说“堆栈”而不是堆栈,因为真正的堆栈更大,并且外部链式 stacklet 表示退出代码时执行的初始化代码的延续。

这些是我从阅读的论文中获得的一些想法。我也有兴趣听到更详细的答案。

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 2016-01-18
    • 2014-01-14
    • 2016-02-14
    • 1970-01-01
    • 2011-02-04
    • 2015-03-28
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多