Haskell-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(来自第三种情况

下面是一个使用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
(来自第三种情况的
aux


如果我们假设
mul
被定义为
mul x y k=k$x*y
,这没有实际意义,因为
y
始终为0。但是得到该结果的实际方法是不同的(除非编译器进行可能的优化)。

区别在于原始定义“短路”尾部调用应用程序传递的任何内置乘法,而更改的表达式只会使测试值短路-它保留内置的“版本”(

IME)使用k而不是传递新的延续,通常可以实现显著的编译器优化。我还没有见过使用k至少不如nk有效的情况,而且通常更快。