Это из учебного примера для иллюстрации СУЗ и хвостовую рекурсию:Нужна помощь понимание функции продолжения
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' вообще. – zerkms