8
Есть ли способ гарантировать, что во время компиляции будет оцениваться следующее выражение:Оценка выражения верхнего уровня во время компиляции
myList :: [Int]
myList = sort [3,2,0,1]
Есть ли способ гарантировать, что во время компиляции будет оцениваться следующее выражение:Оценка выражения верхнего уровня во время компиляции
myList :: [Int]
myList = sort [3,2,0,1]
Если вы, оценки является экземпляром Lift
, вы можете оценить его во время компиляции с помощью TemplateHaskell
:
{-# LANGUAGE TemplateHaskell #-}
module Sort where
import Data.List
import Language.Haskell.TH.Syntax
myList :: [Int]
myList = $(lift (sort [3,2,0,1] :: [Int]))
Если вы хотите, вы можете проверить, что он компилируется с -ddump-splices
:
$ ghc -ddump-splices sort
[1 of 1] Compiling Sort (sort.hs, sort.o)
sort.hs:9:12-41: Splicing expression
lift (sort [3, 2, 0, 1] :: [Int]) ======> [0, 1, 2, 3]
Вы можете проверить сгенерированный Core, чтобы узнать, была ли выполнена эта оптимизация. Но, AFAIK, нет никакого способа заставить это. – chi