Haskell CPS编程风格问题

时间:2010-07-09 00:27:08

标签: 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 = k 0 中将'k'更改为'nk',那两者之间的区别是什么?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

区别在于原始定义“短路”尾部调用应用程序传递的任何组合乘法,而改变后的表达式只是短路测试值 - 它保留了连续函数的构建“版本”

相关问题