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

Geo*_*off 8 io haskell 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
Run Code Online (Sandbox Code Playgroud)

Nor*_*sey 24

因为你的代码相当于

consume store (x:xs) = putMVar store >> consume store xs
Run Code Online (Sandbox Code Playgroud)

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

所以答案是GHC默认不会对此进行优化; 你需要这个-O选项.

(使用GHC版本6.10.1完成的实验.)