问题标签 [delimited-continuations]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
functional-programming - 了解 Racket 中的移位/重置
foldr
我介绍了两个在球拍中的幼稚实现
第一个缺少适当的尾调用,并且对于较大的值是有问题的xs
第二个使用带有延续的辅助函数来实现正确的尾调用,使其可以安全地用于较大的值xs
看着racket/control
我看到球拍支持一流的延续。我想知道表达foldr
using shift
and的第二个实现是否可能/有益reset
。我玩了一会儿,结果我的大脑就彻底翻了。
请提供详尽的解释和任何答案。我在这里寻求大局的理解。
haskell - 连续单子转变
在尝试为 ContT monad 转换器建立一些直觉时,我(也许并不奇怪)发现自己很困惑。问题在于 shiftT 操作,它似乎没有做任何有用的事情。
首先是一个简单的例子,说明如何使用它
famr a
可能是一些更复杂的表达式,只要它返回 some m r
。现在试图解释我的直觉 shiftT 没有添加任何东西:
事实证明,我们可以直接构建 ContT。
提问时间:是否存在 shift/shiftT 在 cont/ContT 之上添加任何内容的情况?还是它们只是用来使代码更具可读性?
haskell - 除了 Maybe 和 Either 之外,还有什么有趣的单发 monad?
在Monte编程语言及其祖先E中,存在用于单次定界延续的语法,称为“喷射器”,它们是在句法边界内有效地仅可使用一次的延续。例如,这里有一个没有调用的喷射器:
还有一个喷射器,称为:
两者都评估为42
。我们还可以在调用喷射器的情况下附加一个动作:
这就是所有这些语法。不难想象这如何模仿Maybe
或Either
。我将把Haskell Wiki on Maybe 上的例子转录成惯用的 Monte:
(注意我们必须承担传递的负担ej
。Monte 缺少 do-notation 的“可编程分号”。)
我不会Either
,但大体上是一样的;添加catch
子句的能力提供了所需的类型区分。分隔延续是众所周知的组合,因此可以构建复杂的工具:
例如,这些小工具在 Monte 中用于构建手写解析器组合器。因此,在《所有单子之母》中,丹·皮波尼解释说Cont
,从某种意义上说,这是一个非常原始Monad
的元素,许多其他元素Monad
都可以在此基础上构建。我们也可以尝试在 Monte 中执行此操作。让我们使用 Moggi 的风格在基于对象的语言中编码 monad:
让我们对绑定助手进行编码i
,以了解它的外观:
...这没有帮助。这看起来不像是好的语法。
未来应该有很酷的机器人,而不是这个。但是,还有另一个问题。让我们编码另一个传统的Monad
,List
:
让我们做一个传统的笛卡尔积。首先,让我们做一个直接的计算;我们将直接使用 list monad 直接绑定,而不是传递延续:
现在有了一个喷射器:
所以!这很有趣。完整的列表单子计算正在运行,但弹出器只看到列表中的第一项。我怀疑,由于喷射器是可组合的,因此有一种方法可以构建更复杂的逻辑单子,它可以更好地不计算这么多中间结果。
那么,我的问题是:当我们将Maybe
andEither
转换为惯用的 Monte 时,我们可以清楚地看到喷射器语法优雅地应用。还有哪些其他单子会有像这样有趣的单次行为?不要觉得局限于 Haskell;Monte 是无类型的,所以没有人会因为难以键入的 monad 而回避你!
haskell - `get` 在 State monad 的 CPS 版本中是如何工作的?
我试图在本教程之后理解一般的延续。
但是,我很难理解第 2.10 节中的以下示例:
state
是int
我想的类型。我不明白的是k
. 根据我的理解,k
捕获所有计算随后发生在 之后get ()
,并且由于我们正在谈论一个状态单子,k
因此可以合理地表示将通过一个 继续进行的计算int
,因此
但从代码来看,它似乎并没有这样做,它需要state
第二次,这实际上意味着:
但我不知道第二个是从哪里来的,在哪种意义上get
是类型unit => 'a
而不是unit => int => 'a
?
与实际的 state monad 实现相比,混乱增加了更多:
即状态转换表示为从状态到结果和状态的元组的函数,这符合我的第一个理解。
任何人都可以领导吗?
其次,我应该如何get
使用 Haskell 在这里实现Control.Monad.Trans.Cont
?我在安慰类型系统时遇到问题。
更新
看来我得到了第二个:
但我仍然不明白为什么我需要将状态两次应用于延续。
scheme - 计划中的延续回报是什么?
我遇到了一些我无法理解的事情。
到目前为止,一切都很好; 的延续(* 10 [])
存储在cc
,如果我们调用(cc 100)
,我们1000
会在 REPL 中看到预期的结果。
但我尝试的下一件事是将变量定义为运行延续的结果:
我200
在 REPL 中看到了结果,但x
没有得到定义。
存储在其中的延续是否cc
包括其返回,以便调用define
从不返回,而评估是 的结果(* 10 val)
?到底是怎么回事?
continuations - 是否有一种编程语言本机支持定界延续?
我想知道一种原生支持分隔延续的编程语言。我确实知道 Scala 曾经有shift
and reset
,但是那些被删除了;而且我也知道 Seaside 似乎有类似的东西,但 Seaside 是一个库,据我了解,Smalltalk 不支持分隔延续。
那么,有没有支持这种延续的编程语言呢?
谢谢!
theory - Fibers / Coroutines vs Delimited Continuations
所以我在这里阅读了一篇关于并发工作窃取双端队列的论文:http: //open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3872.pdf。他们提到了“Child-Stealing vs Continuation Stealing”,他们说儿童窃取可能需要无限的堆栈空间来保存尚未执行的任务,而持续窃取是 P=#processors 的常数因子。
我对纤维/协程和定界延续之间的区别有一个理论问题。首先,我承认协程和纤程几乎是等价的,但纤程也等同于延续吗?我有一个偷偷摸摸的怀疑,我将要实现的内容从根本上是错误的(即用光纤替换线程,而不是实际实现不需要无限内存的版本)。
c - C / x64 ASM 中的实用定界延续
我看过一篇名为A Primer on Scheduling Fork-Join Parallelism with Work Stealing的论文。我想实现持续窃取,调用后的其余代码spawn
有资格被窃取。这是论文中的代码。
一个重要的设计选择是向窃贼线程提供哪个分支。使用图 1,选择是:
偷孩子:
- f() 可用于窃贼线程。
- 执行 e() 的线程执行 g()。
持续偷窃:
- 也称为“偷父母”。
- 执行 e() 的线程执行 f()。
- 延续(接下来将调用 g())对窃贼线程可用。
我听说保存延续需要保存两组寄存器(易失性/非易失性/FPU)。在我所做的光纤实现中,我最终实现了儿童窃取。我读到了关于偷孩子的(理论上的)负面信息(无限数量的可运行任务,请参阅论文以获取更多信息),所以我想改用延续。
我正在考虑两个函数,shift
和reset
,其中reset
界定了当前的延续,并shift
具体化了当前的延续。我的要求在 C 环境中是否合理?
编辑:我正在考虑reset
为当前函数调用(= 第 3 行)制作保存返回地址/NV GPR,并shift
在将值返回给reset
.
kotlin - Kotlin 中的延续可用了吗?有可用的例子吗?
Kotlin 中有一个用于 continuations 的包,但它被标记为实验性的。除了 API 之外没有其他文档,也没有我能找到的任何教程或示例。有谁知道它是否已经可以使用?什么是它的用法示例?
functional-programming - 是否可以检查当前的延续是否正在终止?
是否可以定义一个过程f
,Exiting...
如果它是退出之前要做的最后一件事,则打印,Not done yet...
否则打印?
举些例子,
应该给
尽管
应该给
我曾考虑过使用shift
/等控制运算符reset
,但没有成功。关键的困难似乎是没有办法判断当前的延续是否正在终止。任何想法?