gat*_*ado 11 continuations haskell
我没有正式的延续知识,我想知道是否有人可以帮助我验证和理解我写的代码:).
我试图解决的一般问题是转换表达式
(2 * var) + (3 * var) == 4
Run Code Online (Sandbox Code Playgroud)
进入功能
\x y -> 2 * x + 3 * y == 4 -- (result)
Run Code Online (Sandbox Code Playgroud)
然后可以将其传递到yices-painless
包中.
作为一个更简单的例子,请注意将var
其翻译成\x -> x
.我们怎样才能乘两个var
的(表示他们\x -> x
和\y -> y
)到一个表达\x -> \y -> x * y
?
我听说延续被描述为"计算的其余部分",并认为这就是我所需要的.遵循这个想法,var
应该采取一种功能
f :: ? -> E -- rest of computation
Run Code Online (Sandbox Code Playgroud)
其参数将是创建的变量的值var
,并返回我们想要的内容(代码列表标记result
),一个新函数接受变量x
并返回f x
.因此,我们定义,
var' = \f -> (\x -> f x)
Run Code Online (Sandbox Code Playgroud)
然后,对于乘法,比如xf
和yf
(例如,可能等于var
),我们想要采用f :: ? -> E
如上所述的"其余计算"函数,并返回一个新函数.我们知道函数应该使用和(表示和下面)的值来做什么,并将其定义为如此,xf
yf
x
y
mult xf yf = \f -> xf (\x -> yf (\y -> f (x Prelude.* y)))
Run Code Online (Sandbox Code Playgroud)
const' c = \f -> f c
var' = \f -> (\x -> f x) -- add a new argument, "x", to the function
add xf yf = \f -> xf (\x -> yf (\y -> f (x Prelude.+ y)))
mult xf yf = \f -> xf (\x -> yf (\y -> f (x Prelude.* y)))
v_? = var' -- "x"
v_? = var' -- "y"
v_? = var' -- "z"
m = mult v_? v_? -- "x * y"
a = add m v_? -- "x * y + z"
eval_six = (m id) 2 3
eval_seven = (a id) 2 3 1
two = const' 2 -- "2"
m2 = mult two v_? -- "2 * z"
a2 = add m m2 -- "x * y + 2 * z"
eval_two = (m2 id) 1
eval_eight = (a2 id) 2 3 1
quad_ary = (var' `mult` var') `mult` (var' `mult` var')
eval_thirty = (quad_ary id) 1 2 3 5
Run Code Online (Sandbox Code Playgroud)
好吧,它似乎工作.
是的,这是用连续传递风格(CPS)编写的。
有人曾经向我解释延续性为“无处不在的回调”,我觉得这不是特别有用,但也许你会的。
就像很多事情一样,你能做的最好的事情可能就是继续努力,以更加流畅地运用这种风格。