2016-07-09 3 views
8

Есть ли способ гарантировать, что во время компиляции будет оцениваться следующее выражение:Оценка выражения верхнего уровня во время компиляции

myList :: [Int] 
myList = sort [3,2,0,1] 
+2

Вы можете проверить сгенерированный Core, чтобы узнать, была ли выполнена эта оптимизация. Но, AFAIK, нет никакого способа заставить это. – chi

ответ

7

Если вы, оценки является экземпляром 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]