这是一个函数,使用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',那两者之间的区别是什么?
答案 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)
区别在于原始定义“短路”尾部调用应用程序传递的任何组合乘法,而改变后的表达式只是短路测试值 - 它保留了连续函数的构建“版本”