8

GHC はデフォルトで次の関数の末尾呼び出しの最適化を実行しますか? 唯一の奇妙な点は、再帰的に IO アクションを定義していることですが、これを TCO できない理由がわかりません。

import Control.Concurrent.MVar

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

1 に答える 1

24

あなたのコードは

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

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

答えは、デフォルトでは GHC はこれを最適化しないということです。オプションが必要です-O

(GHC バージョン 6.10.1 で行われた実験。)

于 2009-04-27T04:34:39.627 に答える