Почему оптимизация GHC для постоянных?

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

Для выполнения этой программы требуется некоторое время. Но a не зависит от чего-либо и, следовательно, является постоянным. Он может быть отлично рассчитан во время компиляции. Почему GHC не оптимизирует для этого? Есть ли флаг для этого, или я должен просто заменить такой постоянный расчет самими значениями?

Ответ 1

Это не идеальное решение, но, как уже отмечал kqr, вы, конечно, можете достичь своей цели с помощью шаблона Haskell:

{-# LANGUAGE TemplateHaskell #-}

import Language.Haskell.TH
import Data.List

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

main = print a

Это генерирует целочисленный литерал 4999999950000000 из выражения fold, прежде чем фактически начнет компилировать программу.

Ответ 2

Это то же самое, что и обсуждение этого reddit потока. В принципе, то, что вы хотите, - это простой случай, который на практике необычен. Оптимизация с постоянным складыванием быстро превращается в проблемы, связанные с теоремой Гёделя и проблемой Halting.