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完成的实验.)