haskell - 现代延续运算符到底是什么?

标签 haskell functional-programming scheme continuations delimited-continuations

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .


9 个月前关闭。


社区在 9 个月前审查了是否重新打开此问题并将其关闭:

原始关闭原因未解决






Improve this question




回到那天,我以为我明白了call/cc .这些天我看到更多关于“分隔”延续运算符的引用,它们似乎成对出现,如 shift/reset , prompt/control ,有时还有更奇特的。但是我还没有看到任何基础知识的明确解释,所以

  • 他们在做什么?
  • 它们是干什么用的?
  • 什么可能使一组运算符比另一种更适合特定语言/上下文/目的?
  • 最佳答案

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

     (f (h (g x)) 2)
    ^     << scheme undelimited cont. captures from here 
    
    g捕捉延续。
  • 在方案中,如果您调用 call/ccg 内,它将复制从顶层开始的所有执行堆栈(从调用 f 的点开始)——如果顶层有许多表达式,每个表达式都有自己的 stacklet 并调用保存的延续将在顶层停止(因此,在上面的表达式中,它将在 f 之后停止,此时它的值为 f )。
  • 如果您希望从内部捕获延续 g直到 h 的导出点,并且每次调用延续以将值返回给 f 足以捕获从 h 的调用点开始的堆栈,而不是调用 f 的完整堆栈,所以你想告诉系统调用一个类似于 call/cc 的函数不要从顶层复制其余的计算,而是从给定点复制,并且每次在该点返回一个值:
    (f (h (g x)) 2)
    
       ^        << delimited cont. captures from here 
    
    在这种情况下,您可以对系统进行检测,例如:
    (f (shift (h (g x)) 2))
    
    并调用reset里面 g , 在你需要捕捉延续的地方。
  • 定界延续可以通过无定界延续来模拟,但我认为在某些情况下能够使用定界更实际。因此,您不能以仅在感兴趣区域中复制堆栈的实用方式在方案中执行此操作,它迫使您复制完整的堆栈(我说“堆栈”而不是堆栈,因为真正的堆栈更大,并且外部链式 stacklet 表示退出代码时执行的初始化代码的延续)。

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

    关于haskell - 现代延续运算符到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68947290/

    相关文章:

    haskell - 什么是方便的 Haskell 概念来生成 2^m*3^n*5^l 形式的数字

    algorithm - 为什么我不能从这个 Kadane 算法的 haskell 实现中删除 Ord 类型类?

    javascript - 如何映射任意 Iterables?

    optimization - 延续+尾递归技巧是否真的用堆栈空间交换堆空间?

    embedded - 有人在嵌入式项目中使用 Scheme/LISP 吗?

    parameters - 在 Racket 中传递参数

    Haskell中的随机数列表

    haskell - 在数据类型的每个值上实例化类型类

    functional-programming - Kotlin减少了如何对多个元素进行操作

    parsing - 使脚本在 DrRacket 和 (x)repl 中工作