【发布时间】:2015-10-20 01:27:33
【问题描述】:
这是来自一个教学示例来说明 CPS 和尾递归:
fun sum [] k = k 0
| sum (x::xs) k = sum xs (fn y=>k(x+y));
我无法理解匿名函数 fn y=>k(x+y) 如何正确总结输入列表的元素。
据我了解,匿名函数是指带有一个参数 y 的新函数,其中函数体调用带有参数 y+x 的原始函数 k。
如果我调用 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参数。
标签: functional-programming sml smlnj