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
4

1 回答 1

24

由于您的代码相当于

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

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

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

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

于 2009-04-27T04:34:39.627 回答