这是一个使用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 = k 0中将'k'更改为'nk'怎么办,两者之间有什么区别?

最佳答案

k始终是传递给mlist的原始延续,而对于列表[1,0],在这种情况下nk将是\v -> mul 1 v k(来自aux的第三种情况)。

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

08-16 06:59