编译时的顶级表达式评估

时间:2016-07-09 12:18:04

标签: haskell compile-time-constant

有没有办法确保在编译时评估类似下面的表达式?

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

1 个答案:

答案 0 :(得分:8)

如果您正在评估的是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]