2009-04-27 6 views
8

¿GHC realizará la optimización de la llamada de cola en la siguiente función de forma predeterminada? Lo único raro de esto es que está definiendo recursivamente una acción IO, pero no veo por qué esto no podría ser TCO.¿GHC puede realizar una llamada de cola para optimizar las acciones de E/S?

import Control.Concurrent.MVar 

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

Respuesta

24

Debido a que su código es equivalente a

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

la llamada no ocurre realmente en la posición de la cola. Pero si ejecuta ghc -O y enciende el optimizador, la opción -ddump-simpl le mostrará la salida del código intermedio de GHC, y de hecho optimiza en una función recursiva de cola, que se compilará en un bucle.

Así que la respuesta es que GHC no optimizará esto por defecto; necesita la opción -O.

(Experimentos realizados con GHC versión 6.10.1.)

Cuestiones relacionadas