根据http://en.wikipedia.org/wiki/Fold_(higher-order_function ),如果不需要评估完整列表,则右折叠可以对无限列表进行操作。这可以在 haskell 中看到:
Prelude> take 5 (foldr (:) [] [1 ..])
[1,2,3,4,5]
这在流的 scala 中似乎效果不佳:
Stream.from(1).foldRight(Stream.empty[Int])( (i, s) => i #:: s).take(5)
// StackOverflowError
或在迭代器上:
Iterator.from(1).foldRight(Iterator.empty: Iterator[Int]){ (i, it) =>
Iterator.single(i) ++ it
}.take(5)
// OutOfMemoryError: Java heap space
有没有一种实用的解决方案可以在 Scala 中实现惰性折叠?