问题标签 [continuation-passing]
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.
scheme - 如何将let表达式转换为cps?
我想知道如何将 let 表达式转换为像这样的继续传递样式:
请给我一些例子。谢谢。
node.js - Haskell 的非阻塞 IO
可能重复:
Haskell 对 Node.js 的响应是什么?
如何在 Haskell 中查看多个文件/套接字以使其可读/可写?
是否可以编写一个像 nodejs 那样以非阻塞方式执行 IO 的 Haskell 程序?
例如,我想从一个很远的数据库中获取 10 条记录,所以我想同时触发 10 个请求,当结果可用时,然后返回这个集合。IO monad 不会有帮助,因为 monad 使用 bind 显式地序列化计算。我认为你传递接下来想要的计算的延续传递风格有同样的问题,它再次序列化计算。我不想使用线程,我正在寻找另一种解决方案。这可能吗?
javascript - 延续和回调有什么区别?
我一直在浏览整个网络以寻找关于延续的启示,令人难以置信的是,最简单的解释如何完全让像我这样的 JavaScript 程序员感到困惑。当大多数文章用 Scheme 中的代码解释延续或使用 monad 时,尤其如此。
现在我终于认为我已经理解了延续的本质,我想知道我所知道的是否真的是事实。如果我认为是真的不是真的,那是无知而不是开悟。
所以,这就是我所知道的:
在几乎所有语言中,函数都显式地将值(和控制)返回给它们的调用者。例如:
现在在具有一流函数的语言中,我们可以将控制权和返回值传递给回调,而不是显式返回给调用者:
因此,我们不是从一个函数返回一个值,而是继续另一个函数。因此这个函数被称为第一个函数的延续。
那么延续和回调有什么区别呢?
scala - 为什么 null.asInstanceOf[] 失败?
null.asInstanceOf[<some CPS annotated type>]
编译失败有什么合乎逻辑的原因吗?
有关上下文,请参阅此 github 问题线程。
functional-programming - 在 OCaml 中使用 continuation/CPS 实现尾递归 MergeSort
我正在尝试实现一个tail-recursive
MergeSort
in OCaml
。
由于Mergesort
自然不是尾递归的,所以我用CPS
它来实现它。
我的实现也受到OCaml 中的尾递归合并排序的启发
下面是我的代码
当我编译它并使用 a 运行它时1,000,000
integers
,它给出了stackoverflow
. 为什么?
编辑
这是我用于测试的代码:
在http://try.ocamlpro.com/
,它给出了这个错误:Exception: RangeError: Maximum call stack size exceeded.
在local ocaml top level
,它没有任何问题
scala - Scala CPS 框架中的不一致行为
我正在尝试构建一个协程框架,以通过并行遍历每个数据相关函数来启用批量数据获取。这是我到目前为止所拥有的:http: //pastie.org/7147798
这不起作用
我收到以下错误
这有效
/li>这不起作用
我收到以下错误
这有效
但我收到以下警告
/li>
javascript - Trampoline over Recursion 用于数组和对象迭代
这可能只是“周五 5:00 后我想回家”的效果,但我被这个问题难住了。我有一个递归迭代器方法,我将调用每个方法:
这在大量数据上非常慢(我将在下面解释)。正如@raganwald 在这里解释的那样,蹦床是解决问题的方法。. 我的问题是:如何重构这个递归函数以利用蹦床技术?
所以我有一个轮询机制来请求树的当前状态,在这种情况下,它是一个位置树,它看起来像:
树呈现在属于位置的事物网格中,对于网格中具有位置的每一行,我需要呈现树,将根设置为该行的位置。所以如果我们有:
所以不要介意部分或全部这些可以在服务器端处理——我稍后会优化数据获取的性能。
有没有一种有效的方法来重写我的每种方法以使用 Trampoline 或CPS 样式?
f# - 为什么延续避免stackoverflow?
我一直在尝试理解延续/CPS,并且从我能收集到的内容中,它建立了一个延迟的计算,一旦我们到达列表的末尾,我们就会调用最终的计算。
我不明白的是,当 CPS 看起来类似于根据示例 1 中的幼稚方法构建嵌套函数时,为什么 CPS 会阻止 stackoverflow。对不起,很长的帖子,但试图展示这个想法(以及可能出错的地方)基本:
所以:
示例 1:“天真的方法”
因此,当它运行时,它会迭代地导致:
1 + sumList [2;3]
1 + (2 + sumList [3])
1 + (2 + (3 + 0))
所以嵌套(和溢出问题)可以通过尾递归来克服——运行一个累加器,即
“示例 2:尾递归”
IE,
sumList[2;3] (1+0)
sumList[3] (2+1)
sumList[] (3+3)
因此,因为累加器在每一步都被评估,所以没有嵌套,我们避免了爆栈。清除!
接下来是 CPS,我知道当我们已经有一个累加器但函数不是尾递归时,例如使用 Foldback,这是必需的。尽管在上面的示例中不需要,但将 CPS 应用于此问题会给出:
“示例 3:CPS”
据我了解,迭代地这可以写成:
loop[2;3] (fun x -> cont (1+x))
loop[3] (fun x ->cont (1+x) -> cont(2+x))
loop[] (fun x -> cont (1+x) -> cont(2+x) -> cont (3+x)
然后从右边依次减少,最后一个x = 0
即:
cont(1+x)-> cont(2+x) -> cont (3+0)
cont(1+x)-> cont(2+x) -> 3
cont(1+x) -> cont (2+3)
- ...
cont (1+5) -> 6
我想这类似于:
对原始帖子的更正 - 意识到它是从右侧评估的,例如替换为上述示例cont(h +x)
的cont(h+2*x)
产量17
,与:(1+2*(2+2*(3+2*0)))
即,正是我们在示例 1 中开始的地方,基于此,因为我们仍然需要跟踪我们来自哪里,为什么使用它可以防止示例 1 遭受的溢出问题?
我知道它没有,我哪里出错了?
我已经阅读了以下帖子(多次),但上述困惑仍然存在。
http://www.markhneedham.com/blog/2009/06/22/f-continuation-passing-style/
http://codebetter.com/matthewpodwysocki/2008/08/13/recursing-on-recursion-continuation-passing/
http://lorgonblog.wordpress.com/2008/04/05/catamorphisms-part-one/
scheme - 将函数更改为 CPS 样式
我们被要求编写一个程序,当给定一个列表时,它将替换给定元素的第一次出现,并且只替换第一次出现,但要注意的是要以 CPS 样式编写。我们无法将其转换为 CPS 风格的书面程序,该程序给出了成功-连续和失败-连续..
如果有人愿意试一试,我们将不胜感激:]
我们拥有的程序(由此处的答案慷慨地提供):
haskell - Haskell CPS: How to implement map and filter functions using Cont monad?
I've been trying to learn CPS, seems I didn't really get my head around it, could you implement basic filter and map using Cont monad?