GHC能够尾随调用优化IO操作吗?

时间:2009-04-27 03:22:29

标签: haskell io tail-recursion

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

1 个答案:

答案 0 :(得分:24)

因为您的代码等同于

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

呼叫实际上不会发生在尾部位置。但是如果你运行ghc -O并打开优化器,-ddump-simpl选项将显示GHC中间代码的输出,它确实优化为尾递归函数,它将编译成循环

所以答案是GHC默认情况下不会对此进行优化;你需要-O选项。

(使用GHC版本6.10.1进行的实验。)