Это из учебного примера, иллюстрирующего 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
, и что для получения правильного результата в соответствии с контрактом функции он должен передать функцию идентификации. Правильное решение вообще не раскрывает параметрk
в подписиsum
. - person zerkms   schedule 20.10.2015