讓我們考慮打破了原本的摺疊非終止:平移方案的呼叫/ cc到哈斯克爾callCC
(call/cc (lambda (folded)
(stream-fold
(lambda (acc v)
(if (< v 5)
(cons v acc)
(folded acc)))
'()
(in-naturals 0))))
; returns '(4 3 2 1 0)
哈斯克爾相當於上面的代碼將是
callCC $ \folded -> foldl (\acc v -> if v < 5 then v:acc else folded acc) [] [0..]
此代碼沒有編譯和抱怨無法在摺疊表達式中構造無限類型。我已經知道如何在像Y組合器這樣的情況下消除這種錯誤,但是同樣的方法在這裏似乎不起作用。這種情況的正確方法是什麼?
使用'foldM'而不是'foldl'。在這裏你有'v:acc'和'fold acc'不會返回相同的類型。 – 2014-10-19 04:49:47