19

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で怠惰なフォールドを実現するための実用的な解決策はありますか?

4

1 に答える 1

18

この記事は同じ観察を行い、scalazを使用した怠惰な解決策を提案します。著者とトニーモリスの功績。

于 2011-10-20T04:39:57.820 に答える