2009-04-27 11 views
8

GHCはデフォルトで次の関数でテールコール最適化を実行しますか?それについての奇妙なことは、IOアクションを再帰的に定義していることですが、TCOできない理由はわかりません。あなたのコードがGHCはテールコールでIOアクションを最適化できますか?

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

と等価であるので

import Control.Concurrent.MVar 

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

答えて

24

呼び出しは、実際に末尾位置では発生しません。しかし、ghc -Oを実行してオプティマイザをオンにすると、-ddump-simplオプションはGHCの中間コードの出力を表示し、実際にループにコンパイルされる末尾再帰関数に最適化します。

したがって、GHCはデフォルトでこれを最適化しません。 -Oオプションが必要です。

(GHCバージョン6.10.1での実験)

関連する問題