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)
// StackruError
или на итераторах:
Iterator.from(1).foldRight(Iterator.empty: Iterator[Int]){ (i, it) =>
Iterator.single(i) ++ it
}.take(5)
// OutOfMemoryError: Java heap space
Есть ли практическое решение для достижения ленивого сгиба прямо в Scala?
1 ответ
Решение
Эта статья делает то же самое наблюдение и предлагает ленивое решение с использованием скалаза. Благодарю автора и Тони Морриса.