foldRight在无限懒惰的结构上

时间:2011-10-20 02:26:58

标签: scala fold

根据http://en.wikipedia.org/wiki/Fold_(higher-order_function),如果不需要评估完整列表,则右侧折叠可以在无限列表上运行。这可以在haskell中看到:

Prelude> take 5 (foldr (:) [] [1 ..])
[1,2,3,4,5]

这似乎不适用于scala for streams:

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中实现懒惰折叠是否有实用的解决方案?

1 个答案:

答案 0 :(得分:17)

This article做出相同的观察,并建议使用scalaz的懒惰解决方案。感谢作者和Tony Morris。