2012-11-06 13 views
5

Tôi có nên có thể mong đợi một trình biên dịch Haskell có đủ thông minh để tối ưu hóa các định nghĩa sau đây:ứng dụng một phần và subexpressions tùy thuộc vào chỉ là một tập hợp con của các đối số của một chức năng

h x y = p (m x) (n y) 

vào một cái gì đó như thế này:

h x = let z = m x in \y -> p z (n y) 

? Đây có thể là tiện lợi nếu m là đắt để đánh giá, và tôi sử dụng định nghĩa h 's theo cách sau:

main = print $ map (h 2) hugeList 

Trả lời

8

Nhưng nếu m là giá rẻ để đánh giá, nhưng kết quả của nó đắt để lưu trữ? Nói m x = [x .. ]p cần phải đi qua các tiền tố khác nhau của danh sách đó, tùy thuộc vào n y. Nếu sau đó m 2 được chia sẻ trong map (h 2) hugeList và bất kỳ phần tử danh sách nào yêu cầu tiền tố dài, bạn có yêu cầu bộ nhớ rất lớn ngay cả khi tất cả các phần tử tiếp theo chỉ yêu cầu phần tử đầu tiên của danh sách trả lại kết quả.

Vì vậy, việc chia sẻ tự động m x cũng có thể là một sự bi quan, do đó bạn không nên mong đợi tất cả trình biên dịch tự động chia sẻ nó.

Nói chung, rất khó cho trình biên dịch quyết định xem việc chia sẻ có mang lại lợi ích hay thậm chí là bất lợi, vì vậy bạn nên chia sẻ rõ ràng nơi bạn thực sự muốn. (Tuy nhiên, mong đợi trình biên dịch để giới thiệu chia sẻ ngay cả khi bạn không muốn nó đôi khi.)

Các vấn đề liên quan