我刚刚写了一个延续吗?

时间:2012-01-15 05:58:37

标签: haskell continuations

我没有关于延续的正式知识,我想知道是否有人可以帮助我验证和理解我写的代码:)。

问题

我试图解决的一般问题是转换像

这样的表达式
(2 * var) + (3 * var) == 4

进入功能

\x y -> 2 * x + 3 * y == 4 -- (result)

然后可以传递到yices-painless包。

动机

作为一个更简单的示例,请注意var已翻译为\x -> x。我们如何将两个var(将它们表示为\x -> x\y -> y)乘以一个表达式\x -> \y -> x * y

我听说延续被描述为“计算的其余部分”,并认为这就是我所需要的。遵循这个想法,var应该采取功能

f :: α -> E -- rest of computation

其参数将是创建的变量var,并返回我们想要的内容(代码列表标记为result),一个带有变量的新函数{{ 1}}并返回x。因此,我们定义,

f x

然后,对于乘法,例如var' = \f -> (\x -> f x) xf(例如,可能等于yf),我们想要采用“计算的其余部分”函数{{ 1}}如上所述,并返回一个新函数。我们知道函数应该根据varf :: α -> E(下面表示为xfyf)来定义,并将其定义为,

x

代码

y
好吧,它似乎有效。

1 个答案:

答案 0 :(得分:3)

是的,这是用延续传递方式(CPS)编写的。

有人曾向我解释过“无处不在的回调”,我觉得这并不是特别有用,但也许你会这样做。

对于这么多事情似乎都是如此,你可以做的最好的事情就是继续努力,以提高风格。