Подтвердить что ты не робот

FoldRight на бесконечной ленивой структуре

Согласно 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?

4b9b3361

Ответ 1

Эта статья делает то же самое наблюдение и предлагает ленивое решение, использующее scalaz. Кредит автору и Тони Моррису.