GHC能够对IO操作进行尾递归优化吗?

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
1个回答

24

由于你的代码等效于

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

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

因此,答案是GHC默认情况下不会进行优化;您需要使用-O选项。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接