2009-04-27 4 views
8

GHC eseguirà l'ottimizzazione della coda per la seguente funzione di default? L'unica cosa strana è che sta definendo ricorsivamente un'azione IO, ma non vedo perché questo non possa essere TCO'd.GHC è in grado di chiamare in coda le azioni di ottimizzazione dell'IO?

import Control.Concurrent.MVar 

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

risposta

24

Poiché il codice è equivalente a

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

la chiamata in realtà non si verifica in posizione di coda. Ma se esegui ghc -O e accendi l'ottimizzatore, l'opzione -ddump-simpl ti mostrerà l'output del codice intermedio di GHC, e in effetti lo ottimizzerà in una funzione ricorsiva in coda, che verrà compilata in un ciclo.

Quindi la risposta è che GHC non lo ottimizzerà di default; è necessaria l'opzione -O.

(Esperimenti eseguiti con GHC versione 6.10.1.)

Problemi correlati