phép nói rằng tôi đang cho hai chức năng:Interleaving danh sách các chức năng
f :: [a] -> b
g :: [a] -> c
Tôi muốn viết một hàm có nghĩa là tương đương với việc này:
h x = (f x, g x)
Nhưng khi tôi làm điều đó, cho lớn danh sách chắc chắn tôi hết bộ nhớ.
Một ví dụ đơn giản như sau:
x = [1..100000000::Int]
main = print $ (sum x, product x)
Tôi hiểu đây là trường hợp vì danh sách x
đang được lưu trữ trong bộ nhớ mà không bị thu gom rác thải. Nó sẽ tốt hơn thay vì f
và g
làm việc trên x
trong, tốt, "song song".
Giả sử tôi không thể thay đổi f
và g
, và cũng không muốn thực hiện một bản sao riêng của x
(giả x
là tốn kém để sản xuất) làm thế nào tôi có thể viết h
mà không cần chạy vào ra các vấn đề bộ nhớ?
Tôi chưa thực sự nghiên cứu điều này trước đây, nhưng http://squing.blogspot.com/2008/11/beautiful-folding.html trực tiếp trên điểm. Conal Elliot cũng đã thực hiện một vài followups về chủ đề này. – Carl