问题标签 [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.

0 投票
1 回答
1010 浏览

functional-programming - 了解 Racket 中的移位/重置

foldr我介绍了两个在球拍中的幼稚实现

第一个缺少适当的尾调用,并且对于较大的值是有问题的xs

第二个使用带有延续的辅助函数来实现正确的尾调用,使其可以安全地用于较大的值xs

看着racket/control我看到球拍支持一流的延续。我想知道表达foldrusing shiftand的第二个实现是否可能/有益reset。我玩了一会儿,结果我的大脑就彻底翻了。

请提供详尽的解释和任何答案。我在这里寻求大局的理解。

0 投票
2 回答
510 浏览

haskell - 连续单子转变

在尝试为 ContT monad 转换器建立一些直觉时,我(也许并不奇怪)发现自己很困惑。问题在于 shiftT 操作,它似乎没有做任何有用的事情。

首先是一个简单的例子,说明如何使用它

famr a可能是一些更复杂的表达式,只要它返回 some m r。现在试图解释我的直觉 shiftT 没有添加任何东西:

事实证明,我们可以直接构建 ContT。

提问时间:是否存在 shift/shiftT 在 cont/ContT 之上添加任何内容的情况?还是它们只是用来使代码更具可读性?

0 投票
0 回答
210 浏览

haskell - 除了 Maybe 和 Either 之外,还有什么有趣的单发 monad?

Monte编程语言及其祖先E中,存在用于单次定界延续的语法,称为“喷射器”,它们是在句法边界内有效地仅可使用一次的延续。例如,这里有一个没有调用的喷射器:

还有一个喷射器,称为:

两者都评估为42。我们还可以在调用喷射器的情况下附加一个动作:

这就是所有这些语法。不难想象这如何模仿MaybeEither。我将把Haskell Wiki on Maybe 上的例子转录成惯用的 Monte:

(注意我们必须承担传递的负担ej。Monte 缺少 do-notation 的“可编程分号”。)

我不会Either,但大体上是一样的;添加catch子句的能力提供了所需的类型区分。分隔延续是众所周知的组合,因此可以构建复杂的工具:

例如,这些小工具在 Monte 中用于构建手写解析器组合器。因此,在《所有单子之母》中,丹·皮波尼解释说Cont,从某种意义上说,这是一个非常原始Monad的元素,许多其他元素Monad都可以在此基础上构建。我们也可以尝试在 Monte 中执行此操作。让我们使用 Moggi 的风格在基于对象的语言中编码 monad:

让我们对绑定助手进行编码i,以了解它的外观:

...这没有帮助。这看起来不像是好的语法。

未来应该有很酷的机器人,而不是这个。但是,还有另一个问题。让我们编码另一个传统的MonadList

让我们做一个传统的笛卡尔积。首先,让我们做一个直接的计算;我们将直接使用 list monad 直接绑定,而不是传递延续:

现在有了一个喷射器:

所以!这很有趣。完整的列表单子计算正在运行,但弹出器只看到列表中的第一项。我怀疑,由于喷射器是可组合的,因此有一种方法可以构建更复杂的逻辑单子,它可以更好地不计算这么多中间结果。

那么,我的问题是:当我们将MaybeandEither转换为惯用的 Monte 时,我们可以清楚地看到喷射器语法优雅地应用。还有哪些其他单子会有像这样有趣的单次行为?不要觉得局限于 Haskell;Monte 是无类型的,所以没有人会因为难以键入的 monad 而回避你!

0 投票
1 回答
290 浏览

haskell - `get` 在 State monad 的 CPS 版本中是如何工作的?

我试图在本教程之后理解一般的延续。

但是,我很难理解第 2.10 节中的以下示例:

stateint我想的类型。我不明白的是k. 根据我的理解,k捕获所有计算随后发生在 之后get (),并且由于我们正在谈论一个状态单子,k因此可以合理地表示将通过一个 继续进行的计算int,因此

但从代码来看,它似乎并没有这样做,它需要state第二次,这实际上意味着:

但我不知道第二个是从哪里来的,在哪种意义上get是类型unit => 'a而不是unit => int => 'a

与实际的 state monad 实现相比,混乱增加了更多:

即状态转换表示为从状态到结果和状态的元组的函数,这符合我的第一个理解。

任何人都可以领导吗?

其次,我应该如何get使用 Haskell 在这里实现Control.Monad.Trans.Cont?我在安慰类型系统时遇到问题。


更新

看来我得到了第二个:

但我仍然不明白为什么我需要将状态两次应用于延续。

0 投票
2 回答
541 浏览

scheme - 计划中的延续回报是什么?

我遇到了一些我无法理解的事情。

到目前为止,一切都很好; 的延续(* 10 [])存储在cc,如果我们调用(cc 100),我们1000会在 REPL 中看到预期的结果。

但我尝试的下一件事是将变量定义为运行延续的结果:

200在 REPL 中看到了结果,但x没有得到定义。

存储在其中的延续是否cc包括其返回,以便调用define从不返回,而评估是 的结果(* 10 val)?到底是怎么回事?

0 投票
2 回答
279 浏览

continuations - 是否有一种编程语言本机支持定界延续?

我想知道一种原生支持分隔延续的编程语言。我确实知道 Scala 曾经有shiftand reset,但是那些被删除了;而且我也知道 Seaside 似乎有类似的东西,但 Seaside 是一个库,据我了解,Smalltalk 不支持分隔延续。

那么,有没有支持这种延续的编程语言呢?

谢谢!

0 投票
1 回答
365 浏览

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 的常数因子。

我对纤维/协程和定界延续之间的区别有一个理论问题。首先,我承认协程和纤程几乎是等价的,但纤程也等同于延续吗?我有一个偷偷摸摸的怀疑,我将要实现的内容从根本上是错误的(即用光纤替换线程,而不是实际实现不需要无限内存的版本)。

0 投票
1 回答
347 浏览

c - C / x64 ASM 中的实用定界延续

我看过一篇名为A Primer on Scheduling Fork-Join Parallelism with Work Stealing的论文。我想实现持续窃取,调用后的其余代码spawn有资格被窃取。这是论文中的代码。

一个重要的设计选择是向窃贼线程提供哪个分支。使用图 1,选择是:

偷孩子:

  • f() 可用于窃贼线程。
  • 执行 e() 的线程执行 g()。

持续偷窃:

  • 也称为“偷父母”。
  • 执行 e() 的线程执行 f()。
  • 延续(接下来将调用 g())对窃贼线程可用。

我听说保存延续需要保存两组寄存器(易失性/非易失性/FPU)。在我所做的光纤实现中,我最终实现了儿童窃取。我读到了关于偷孩子的(理论上的)负面信息(无限数量的可运行任务,请参阅论文以获取更多信息),所以我想改用延续。

我正在考虑两个函数,shiftreset,其中reset界定了当前的延续,并shift具体化了当前的延续。我的要求在 C 环境中是否合理?

编辑:我正在考虑reset为当前函数调用(= 第 3 行)制作保存返回地址/NV GPR,并shift在将值返回给reset.

0 投票
2 回答
463 浏览

kotlin - Kotlin 中的延续可用了吗?有可用的例子吗?

Kotlin 中有一个用于 continuations 的包,但它被标记为实验性的。除了 API 之外没有其他文档,也没有我能找到的任何教程或示例。有谁知道它是否已经可以使用?什么是它的用法示例?

0 投票
1 回答
59 浏览

functional-programming - 是否可以检查当前的延续是否正在终止?

是否可以定义一个过程fExiting...如果它是退出之前要做的最后一件事,则打印,Not done yet...否则打印?

举些例子,

应该给

尽管

应该给

我曾考虑过使用shift/等控制运算符reset,但没有成功。关键的困难似乎是没有办法判断当前的延续是否正在终止。任何想法?