Haskell-CPS编程风格问题
下面是一个使用CPS样式将列表中的元素相乘的函数Haskell-CPS编程风格问题,haskell,continuations,Haskell,Continuations,下面是一个使用CPS样式将列表中的元素相乘的函数 mlist xx k = aux xx k where aux [] nk = nk 1 aux (0:xs) nk = k 0 aux (x:xs) nk = aux xs $ \v -> mul x v nk 如果我将表达式中的aux(0:xs)nk=k0中的'k'改为'nk',两者之间有什么区别呢?k始终是传递给mlist的原始延续,而对于列表[1,0]nk,在这种情况下将是\v->mul 1vk(来自第三种情况
mlist xx k = aux xx k
where aux [] nk = nk 1
aux (0:xs) nk = k 0
aux (x:xs) nk = aux xs $ \v -> mul x v nk
如果我将表达式中的aux(0:xs)nk=k0中的'k'改为'nk',两者之间有什么区别呢?
k
始终是传递给mlist
的原始延续,而对于列表[1,0]nk
,在这种情况下将是\v->mul 1vk
(来自第三种情况的aux
)
如果我们假设
mul
被定义为mul x y k=k$x*y
,这没有实际意义,因为y
始终为0。但是得到该结果的实际方法是不同的(除非编译器进行可能的优化)。区别在于原始定义“短路”尾部调用应用程序传递的任何内置乘法,而更改的表达式只会使测试值短路-它保留内置的“版本”(IME)使用k而不是传递新的延续,通常可以实现显著的编译器优化。我还没有见过使用k至少不如nk有效的情况,而且通常更快。