import Data.List
a = foldl' (+) 0 [1..99999999]
main = putStrLn $ show $ a
该程序需要一段时间才能运行。但a
不依赖于任何东西,因此是恒定的。它可以在编译时完美计算。为什么 GHC 不为此进行优化?是否有这样做的标志,或者我应该用值本身替换那种常量计算?
import Data.List
a = foldl' (+) 0 [1..99999999]
main = putStrLn $ show $ a
该程序需要一段时间才能运行。但a
不依赖于任何东西,因此是恒定的。它可以在编译时完美计算。为什么 GHC 不为此进行优化?是否有这样做的标志,或者我应该用值本身替换那种常量计算?
这不是一个完美的解决方案,但正如 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
4999999950000000
这会在实际开始编译程序之前从折叠表达式生成整数文字。
这与此 reddit线程所涵盖的讨论相同。基本上,您想要的只是一个在实践中不常见的简单案例。使用恒定折叠进行优化很快就会变成关于哥德尔定理和停机问题的问题。