3

这是一个使用 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'怎么办,这两者有什么区别?

4

2 回答 2

4

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

如果我们假设mul定义为mul x y k = k $ x*y,这不会产生实际差异,因为y它将始终为 0。但是达到该结果的实际方法是不同的(除非编译器可能进行优化)。

于 2010-07-09T00:51:15.867 回答
1

不同之处在于,原始定义“短路”尾调用应用程序传递的任何累积乘法,而更改后的表达式仅短路测试值 - 它保留了延续函数的累积“版本”。

于 2010-07-09T07:34:16.963 回答