2009-04-27 32 views
8

GHC sẽ thực hiện tối ưu hóa đuôi cuộc gọi trên chức năng sau theo mặc định? Điều kỳ lạ duy nhất về nó là nó được đệ quy xác định một hành động IO, nhưng tôi không thấy lý do tại sao điều này không thể được TCO'd.GHC có thể kết nối cuộc gọi tối ưu hóa các hành động IO không?

import Control.Concurrent.MVar 

consume :: MVar a -> [a] -> IO() 
consume _ [] = return() 
consume store (x:xs) = do putMVar store x 
          consume store xs 

Trả lời

24

Kể từ mã của bạn là tương đương với

consume store (x:xs) = putMVar store >> consume store xs 

cuộc gọi không thực sự xảy ra ở vị trí đuôi. Nhưng nếu bạn chạy ghc -O và bật trình tối ưu hóa, tùy chọn -ddump-simpl sẽ cho bạn thấy đầu ra của mã trung gian của GHC và nó thực sự tối ưu hóa thành một hàm đệ quy đuôi, sẽ biên dịch thành một vòng lặp.

Vì vậy, câu trả lời là GHC sẽ không tối ưu hóa điều này theo mặc định; bạn cần tùy chọn -O.

(Thử nghiệm được thực hiện bằng phiên bản GHC 6.10.1.)

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