functional-programming - 理解(子、部分、完整、一次性)延续(程序语言)

标签 functional-programming continuations procedural-programming

在阅读了我能找到的关于延续的几乎所有内容后,我仍然无法理解它们。也许是因为所有的解释都与 lambda 演算密切相关,我很难理解。

通常,在您完成当前的事情(即计算的其余部分)之后,continuation 是下一步要做什么的某种表示。

但是,随着各种变化,它变得更加棘手。也许你们中的一些人可以在这里帮助我解决我的习惯类比,并指出我在理解上犯的错误。

假设我们的函数被表示为对象,为了简单起见:

  • 我们的解释器有一堆函数调用。
  • 每个函数调用都有一个用于本地数据和参数的堆栈。
  • 每个函数调用都有一个要执行的“指令”队列,这些指令对本地数据堆栈和队列本身(也可能在调用者的堆栈上)进行操作。

  • 这个类比类似于 XY concatenative language .

    所以,以我的理解:
  • 延续是整个计算的其余部分(这个未完成的指令队列 + 所有后续计算的堆栈:调用者队列)。
  • 部分延续是当前未完成的队列 + 调用者堆栈的一些分隔部分,直到某个点(不是完整的,对于整个程序)。
  • 子延续是当前“事件”功能的当前指令队列的其余部分。
  • one-shot continuation 就是这样一种只能执行一次的 continuation,
    被具体化为对象后。

  • 如果我的类比有误,请纠正我。

    最佳答案

    A continuation is the rest of the whole computation (this unfinished queue of instructions + stack of all subsequent computations: queues of callers)



    非正式地,您的理解是正确的。然而,作为一个概念的延续是控制状态的抽象,如果调用延续,流程应该达到的状态。它不需要显式包含整个堆栈,只要可以达到状态即可。这是延续的经典定义之一。 Refer to Rhino JavaScript doc.

    A partial continuation is the current unfinished queue + some delimited part of the caller stack, up until some point (not the full one, for the whole program)



    同样,非正式地,您的理解是正确的。也叫delimited continuation或可组合的延续。在这种情况下,进程不仅需要获得由分隔的延续所代表的状态,而且还需要将延续的调用限制在指定的限制内。这与完全延续形成对比,后者从指定的点开始并持续到控制流的末尾。定界延续从该点开始,仅在另一个标识点结束。它是部分控制流而不是完整的控制流,这正是分隔继续需要返回值的原因(请参阅 the Wikipedia article )。该值通常表示部分执行的结果。

    A sub-continuation is the rest of the current instruction queue for currently "active" function



    你对这里的理解有点模糊。理解这一点的一种方法是考虑多线程环境。如果有一个主线程并且在某个时刻从它启动了一个新线程,那么一个延续(从主线程或子线程的上下文),它应该代表什么?从那时起子线程和主线程的整个控制流(在大多数情况下没有多大意义)或只是子线程的控制流?子延续是一种定界延续,控制流状态表示从一个点到另一个点,是子流程或子流程树的一部分。 Refer to this paper.

    A one-shot continuation is such a continuation that can be executed only once, after being reified into an object



    As per this paper ,你的理解是对的。该论文似乎没有明确说明这是完整/经典的延续还是分隔的;然而,在接下来的部分,论文指出完全延续是有问题的,所以我假设这种类型的延续是一个定界的延续。

    关于functional-programming - 理解(子、部分、完整、一次性)延续(程序语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46379461/

    相关文章:

    php - php中mysql的过程化和面向对象实现的区别?

    c - 重构过程代码时处理错误

    haskell - 计算列表中满足给定谓词的元素数量

    .net - F# 和鸭式打字

    scheme - 有关于 "yin-yang puzzle"的详细历史背景吗?

    javascript - javascript 中循环和 CPS 循环的完全奇怪的性能

    ruby - Ruby 中的Scheme 动态风的等价物

    swift - 使用函数时编译时间长(Swift 4)

    algorithm - 在 Haskell 中解决代码厨师(CHEF 和​​ Way)上的 CHRL4

    php - 过程式 PHP 与面向对象的 PHP