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]
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]
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]
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