2016-07-09 15 views
8

Có cách nào để đảm bảo rằng biểu thức như sau sẽ được đánh giá tại thời gian biên dịch không?Đánh giá biểu thức cấp cao nhất tại thời điểm biên dịch

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

Bạn có thể kiểm tra Lõi được tạo để xem liệu tối ưu hóa đó có được thực hiện hay không. Nhưng, AFAIK, không có cách nào để ép buộc điều đó. – chi

Trả lời

7

Nếu những gì bạn đang đánh giá là một thể hiện của Lift, bạn có thể đánh giá nó ở thời gian biên dịch sử dụng TemplateHaskell:

{-# LANGUAGE TemplateHaskell #-} 

module Sort where 

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

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

Nếu bạn muốn, bạn có thể kiểm tra những gì nó đã biên soạn để có -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] 
Các vấn đề liên quan