为什么GHC不能针对常数进行优化?

时间:2013-09-08 11:53:52

标签: haskell optimization ghc

import Data.List
a = foldl' (+) 0 [1..99999999]
main = putStrLn $ show $ a

此程序需要一段时间才能运行。但是a并不依赖于任何东西,因此是不变的。它可以在编译时完美计算。为什么不对GHC进行优化呢?它是否有一个标志,或者我应该用值本身替换那种常量计算?

2 个答案:

答案 0 :(得分:12)

这不是一个完美的解决方案,但正如kqr已经说过的那样,你当然可以通过Template Haskell实现你的目标:

{-# LANGUAGE TemplateHaskell #-}

import Language.Haskell.TH
import Data.List

a :: Integer
a = $( return . LitE . IntegerL $ foldl' (+) 0 [1..99999999] )

main = print a

在实际开始编译程序之前,这会从fold表达式生成整数文字4999999950000000

答案 1 :(得分:7)

这与this reddit线程所涵盖的讨论相同。基本上,你想要的只是一个在实践中不常见的简单案例。通过恒定折叠进行优化很快就会成为关于哥德尔定理和停止问题的问题。