这是从教学的例子来说明CPS和尾递归:需要帮助了解连续函数
fun sum [] k = k 0
| sum (x::xs) k = sum xs (fn y=>k(x+y));
我理解如何匿名函数fn y=>k(x+y)
将正确总结输入列表中的元素问题。
据我所知,匿名函数意味着一个带有一个参数y的新函数,其中函数体调用原函数k
,参数为y+x
。
如果我调用sum [1,2,3,4,5] (fn x=>x);
我得到15.如果我有sum [1,2,3,4,5] (fn x=>3x);
答案是45。sum
功能的用户,因此必须先了解sum
确切的血淋淋的细节,因为只有中k
适当的版本将产生总和给定列表。以这种方式提供用户提供的功能的真实目的是什么?
如果我是sum
函数的作者,我无法控制用户通过k
的内容。换句话说,我怎么甚至指定这个函数会精确地做什么?
这是一个坏榜样,我认为:消费者不应该知道的是'k'就是实现这样的细节,并且得到正确的根据功能合同的结果,他们必须通过身份识别功能。 “适当的”解决方案根本不会暴露'sum'签名中的'k'参数。 – zerkms