我没有关于延续的正式知识,我想知道是否有人可以帮助我验证和理解我写的代码:)。
我试图解决的一般问题是转换像
这样的表达式(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}}如上所述,并返回一个新函数。我们知道函数应该根据var
和f :: α -> E
的值(下面表示为xf
和yf
)来定义,并将其定义为,
x
y
好吧,它似乎有效。
答案 0 :(得分:3)
是的,这是用延续传递方式(CPS)编写的。
有人曾向我解释过“无处不在的回调”,我觉得这并不是特别有用,但也许你会这样做。
对于这么多事情似乎都是如此,你可以做的最好的事情就是继续努力,以提高风格。