2012-02-08 29 views
6

Giả sử tôi có hai hàm f :: [a] -> bg :: [a] -> c. Tôi có hai câu hỏi sau:Có thể cho trường hợp được trình bày được tối ưu hóa thành một vòng lặp không?

  1. Nếu tôi thực hiện (f &&& g) xs nơi xs :: [a], và nếu cả hai fg liên quan đến vòng, là nó có thể cho trình biên dịch để tối ưu hóa hai vòng này thành một? (Xin lưu ý rằng tôi không hỏi xem một số trình biên dịch Haskell cụ thể thực hiện điều này. Tôi muốn biết liệu một điều như vậy là thể.)

  2. thể các traverse chức năng từ Traverse kiểu lớp giúp tôi có như vậy một tối ưu hóa với một cái gì đó dọc theo dòng sau đây:

    traverse (someCombinator f g) xs 
    
+0

Tôi nghĩ tối ưu hóa như trong 1. có thể được thực hiện bởi các siêu máy tính. – Landei

Trả lời

9

Đó là về mặt lý thuyết có thể để tối ưu hóa mã này, nhưng rất rất khó khăn, bởi vì fg có thể tiêu thụ một lượng khác nhau của danh sách đầu vào. Chỉ khi họ tiêu thụ cùng một số tiền, hoặc g luôn luôn tiêu thụ nhiều danh sách hơn f (hoặc ngược lại), nó sẽ có thể thực hiện tối ưu hóa. Sự cố tạm dừng ngăn cản trình biên dịch phát hiện các điều kiện như vậy trong mã phức tạp.

Chỉ trong trường hợp đơn giản, trong đó cả hai fg hãy sử dụng foldr nội bộ, ví dụ, sẽ có thể thực hiện tối ưu hóa tầm thường mà không cần quan tâm sâu hơn.

Chức năng traverse sẽ không giúp bạn ở đây, bởi vì không có cách nào hợp lý thực hiện someCombinator (Làm thế nào để bạn muốn chuyển đổi nhiều cuộc gọi của a 's thành một [a] mà không hacks nghiêm trọng? Và sau đó bạn đang trở lại nơi mà bạn bắt đầu anyways).

chỉ thực sự lựa chọn của bạn là làm fg vào các thư mục, do đó họ có chữ ký f :: a -> b -> bg :: a -> c -> c, có nghĩa là giá trị của bc có thể được tính theo từng bước. Sau đó, bạn có thể sử dụng \ a -> f a *** g a để có được một thư mục mà bạn có thể sử dụng theo cách thông thường (phải trong trường hợp này).

+0

Câu trả lời hay. Cảm ơn rất nhiều! Tôi đã đăng câu hỏi này bởi vì tôi muốn kiểm tra xem điều tôi đã nói trong [chủ đề này] (http://stackoverflow.com/questions/9162256/cartesian-product-traverse-in-scalaz/9162706#9162706) (cả trong câu trả lời và trong nhận xét) là chính xác. – missingfaktor

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