2009-04-27 7 views
8

Wird GHC die Tail-Call-Optimierung standardmäßig für die folgende Funktion ausführen? Das einzig Seltsame daran ist, dass es rekursiv eine IO-Aktion definiert, aber ich sehe nicht, warum das nicht TCO'd sein könnte.Kann GHC E-Mail-Aktionen optimieren?

import Control.Concurrent.MVar 

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

Antwort

24

Da Ihr Code äquivalent zu

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

der Anruf tatsächlich nicht in Schwanz Position auftreten. Aber wenn Sie ghc -O ausführen und den Optimierer einschalten, zeigt die Option -ddump-simpl Ihnen die Ausgabe des GHC-Zwischencodes an, und es optimiert sich tatsächlich zu einer tail-rekursiven Funktion, die zu einer Schleife kompiliert wird.

Also die Antwort ist GHC wird dies nicht standardmäßig optimieren; Sie benötigen die Option -O.

(Experimente mit GHC Version 6.10.1.)