2011-10-20 24 views
18

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?

Trả lời

17

This article có cùng quan sát và gợi ý giải pháp lười biếng khi sử dụng scalaz. Tín dụng cho tác giả, và Tony Morris.

+0

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

+7

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)) ' –