![](/img/trans.png)
[英]Compiling Tail-Call Optimization In Mutual Recursion Across C and Haskell
[英]Is GHC able to tail-call optimize IO actions?
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
因为你的代码相当于
consume store (x:xs) = putMVar store >> consume store xs
呼叫实际上并不发生在尾部位置。 但是如果你运行ghc -O
并打开优化器, -ddump-simpl
选项将显示GHC中间代码的输出,它确实优化为尾递归函数,它将编译成循环。
所以答案是GHC默认不会对此进行优化; 你需要-O
选项。
(使用GHC版本6.10.1完成的实验。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.