Может ли GHC выполнять хвостовую оптимизацию операций ввода-вывода? - PullRequest
8 голосов
/ 27 апреля 2009

Будет ли GHC выполнять оптимизацию хвостового вызова для следующей функции по умолчанию? Единственная странная вещь в этом - это то, что он рекурсивно определяет действие ввода-вывода, но я не понимаю, почему это не может быть TCO'd.

import Control.Concurrent.MVar

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

1 Ответ

24 голосов
/ 27 апреля 2009

Поскольку ваш код эквивалентен

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

вызов на самом деле не происходит в хвостовой позиции. Но если вы запустите ghc -O и включите оптимизатор, опция -ddump-simpl покажет вам вывод промежуточного кода GHC, и он действительно оптимизируется в хвостовую рекурсивную функцию, которая скомпилируется в цикл.

Так что ответ GHC не оптимизирует это по умолчанию; вам нужна опция -O.

(Эксперименты выполнены с GHC версии 6.10.1.)

...