2016-07-09 25 views
8

Gibt es eine Möglichkeit sicherzustellen, dass ein Ausdruck wie der folgende zur Kompilierzeit ausgewertet wird?Ausdruckauswertung auf oberster Ebene zur Kompilierzeit

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

Sie können den generierten Kern prüfen, um zu sehen, ob diese Optimierung durchgeführt wurde. Aber, AFAIK, gibt es keine Möglichkeit, das zu erzwingen. – chi

Antwort

7

Wenn das, was Sie die Bewertung eine Instanz von Lift ist, können Sie es bei der Kompilierung mit TemplateHaskell bewerten:

{-# LANGUAGE TemplateHaskell #-} 

module Sort where 

import Data.List 
import Language.Haskell.TH.Syntax 

myList :: [Int] 
myList = $(lift (sort [3,2,0,1] :: [Int])) 

Wenn Sie möchten, können Sie überprüfen, was es zu zusammengestellt mit -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]