這是從教學的例子來說明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