Theo http://en.wikipedia.org/wiki/Fold_(higher-order_function), một nếp gấp bên phải có thể hoạt động trên danh sách vô hạn nếu danh sách đầy đủ không phải được đánh giá. Điều này có thể được nhìn thấy trong hành động trong Haskell:foldRight trên cấu trúc lười vô hạn
Prelude> take 5 (foldr (:) [] [1 ..])
[1,2,3,4,5]
này dường như không làm việc tốt trong scala cho suối:
Stream.from(1).foldRight(Stream.empty[Int])((i, s) => i #:: s).take(5)
// StackOverflowError
hoặc lặp:
Iterator.from(1).foldRight(Iterator.empty: Iterator[Int]){ (i, it) =>
Iterator.single(i) ++ it
}.take(5)
// OutOfMemoryError: Java heap space
Có một thực tế giải pháp để đạt được một lần lười biếng ngay trong Scala?
Cảm ơn bạn. Tôi có thể sử dụng scalaz. Nó hoạt động cho 'Stream'. Iterator có vẻ phức tạp hơn ... – huynhjl
Bài báo không gợi ý sử dụng scalaz, nhưng đưa ra một giải pháp trong scala thuần túy mà nó nói được lấy cảm hứng từ việc thực hiện của scalaz: 'def foldr [A, B] (kết hợp: (A, = > B) => B, cơ sở: B) (xs: Stream [A]): B = if (xs.isEmpty) cơ sở khác kết hợp (xs.head, foldr (kết hợp, cơ sở) (xs.tail)) ' –