【发布时间】:2014-10-19 01:38:44
【问题描述】:
让我们考虑打破原本不会终止的折叠:
(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)
上述代码的 Haskell 等效项是
callCC $ \folded -> foldl (\acc v -> if v < 5 then v:acc else folded acc) [] [0..]
此代码无法编译并抱怨无法在表达式 folded acc 中构造无限类型。我已经知道如何在 Y 组合器之类的情况下消除这种错误,但同样的方法在这里似乎不起作用。这种情况的正确方法是什么?
【问题讨论】:
-
使用
foldM而不是foldl。在这里你有v:acc和folded acc不返回相同的类型。
标签: haskell scheme continuations