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

0 投票
0 回答
15 浏览

visual-studio-2010 - Visual basic从最后一个数据网格表单传递值并将其更新为新表单

我的代码有问题。问题是我无法获取 ID。

这是我的代码。

0 投票
3 回答
1426 浏览

f# - F# 基于延续的尾递归

有人可以澄清acc ""在终止基于延续的尾递归函数时的必要性,如下例所示:

如果结果是一个列表,它会是acc [], 和acc 0整数。

0 投票
1 回答
114 浏览

scheme - 连续传球风格的 ANF 转换

http://matt.might.net/articles/a-normalization/中给出了将代码从 S 表达式转换为 A 范式的算法

作者做出了不寻常的选择,以延续传递风格编写算法。(也就是说,不是任何阶段的中间代码都用 CPS 表示,而是用 CPS 编写的用于进行转换的手写代码。)

就我所看到的它是如何工作的而言,这是有道理的,并且延续代表了每个生成的主体let,但直觉上令人惊讶的是,CPS 应该是人类编写代码的最清晰的方式。

这实际上是 ANF 转换算法的最清晰形式,还是有不使用 CPS 的已知更好方法?

0 投票
1 回答
177 浏览

scheme - 将函数更改为 CPS,以不使用 call/cc

我想了解如何没有call/cc.

我从这个小例子开始了解如何修改代码以便我可以在不使用它的情况下使用它call/cc

当我使用它执行函数时,call/cc它给了我5,然后当我执行时6(x 4)

我使用此功能替换call/cc

我试图将此功能更改为 CPS(连续传递样式):

但是当我执行它时,我得到3而不是5。但我确实得到了6个。(x 4)

你能告诉我有什么问题吗?谢谢你

0 投票
1 回答
178 浏览

haskell - 如何从具有类型相等约束的 Scott 编码的 GADT 中获取值?

我正在阅读24 天 GHC 扩展的 Rank-N-Types 部分,并遇到了以下 GADT:

尽管unSome它的类型变量是多态的,但可以向编译器证明,在这种SomeInt情况下,给给定值加三是安全的。作者将这种类型称为细化。

现在我很好奇我是否可以对 Scrott 编码类型做同样的事情。幸运的是,有一个这样的编码示例。我们只需要打开 Rank-N-Types 和 Type-Families 扩展:

但是,unSome文章中没有提供。我不精通 Haskell,也不知道如何使用 Scott 编码来实现这个功能。尤其是类型等式约束(例如(a ~ Int) =>)让我感到困惑。

感谢您提供有关其他在线资源的任何帮助或信息。

0 投票
2 回答
1254 浏览

ocaml - ocaml 中的继续传递样式

我对这个概念有点困惑。所以我有以下功能

继续,可以写成

我仍然c对它的手段和作用感到困惑

0 投票
1 回答
345 浏览

functional-programming - Kotlin Either monad:重构构造函数调用以处理 CPS

我是函数式编程和 Kotlin 的绝对初学者,试图解决我从问自己的问题中创建的练习;我目前的问题是“如何使用端口和适配器架构将函数式编程应用到现实世界的应用程序中?”

目前正在学习Eithermonad,我有以下函数,其中Perhaps<T>只是重命名Either<Err, T>用于异常处理

此函数接受RequestModel包含任意 HTTP 参数的 a,并且可能Perhaps返回一个CountBetweenQuery仅包含两个 的数据类LocalDate

在 OO 语言中,我将对其进行重构,以便在通用异常处理程序中以以下方式处理异常,或在以上(其中重复的代码被提取到单个方法中)更高的方式处理异常。自然地,我想把我的extractLocalDateOrThrow变成perhapsExtractLocalDate我的练习的一部分:

我已经挣扎了一个小时,试图弄清楚如何CountBetweenQuery在保留延续传递风格的同时调用构造函数。

这就是我想出的:

起初我希望使用return并且apply因为这两个方法调用perhapsExtractLocalDate是独立的,因此我会使用应用程序样式。相反,我无法弄清楚如何避免使用bind,根据我的理解,这意味着一种单子风格。

我的问题是:

  • 如果我的理解是正确的,我怎样才能把它变成应用风格?

  • 在上面的实现中是否有任何严重的错误?(即成语,误用柯里化)

0 投票
1 回答
555 浏览

haskell - 可以给延续单子变换器一个带有一些和许多的替代实例吗?

我们可以将延续单子变换器定义为

如果是via的成员,我们可以给出Cont r m一个 Alternative 实例mAlternative

然后允许somemany采用他们的默认方法。我的问题是,我们可以用's和来定义someand来代替默认定义吗?显而易见的选择manymsomemany

显然不起作用(他们甚至不进行类型检查)。有没有其他方法可以使用它们(如果我们m也需要成为一个单子,那很好)?

作为参考,some并且many必须是方程的最小解:

  • some v = (:) <$> v <*> many v
  • many v = some v <|> pure []

假设some :: m a -> m [a]并且many :: m a -> [a]满足这个定律,那么应该some :: Cont r m a -> Cont r m [a]many :: Cont r m a -> Cont r m [a]

0 投票
1 回答
85 浏览

haskell - 如何从 ContT 分派不同类型?

我想基于ContT. 我创建了一个 GADT 来表示不同的 IO 操作:

我编写了一个函数,将这些转换IO为在 IO monad 中使用的命令,如下所示:

以下是它的示例用法:

它应该与类似的东西一起运行runContT echoChar continueIO。但是,PutCharandGetChar命令的类型有冲突。如何从同一个 ContT 分派两种类型?

PS对不起,如果这个问题中的任何内容措辞尴尬。我想在这里给自己一个挑战,但我并不完全明白我在做什么。

编辑:我的解决方案不受限制,我不必使用ContT.

0 投票
1 回答
60 浏览

haskell - 如何使用以连续传递样式编码的 Reader 类型

我的印象是,每个类型的值a都可以用newtype Id a = Id {runId :: forall r. (a -> r) -> r }连续传递风格的 2 级多态类型来描述。所以我派生了以下类型来Reader相应地定义:

然后我尝试构造一个这种类型的值并运行它:

如果ReaderCPS 中的编码及其类型有效,我将如何使用它?