关闭。这个问题需要更多 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/cc
在 g
内,它将复制从顶层开始的所有执行堆栈(从调用 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
, 在你需要捕捉延续的地方。这些是我从阅读的论文中获得的一些想法。我也有兴趣听到更详细的答案。
关于haskell - 现代延续运算符到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68947290/