7
使用Sing
從GHC.TypeLits是否有任何開銷?例如,對於該程序:GHC TypeLits開銷
{-# LANGUAGE DataKinds #-}
module Test (test) where
import GHC.TypeLits
test :: Integer
test = fromSing (sing :: Sing 5)
GHC生成核心代碼:
Test.test1 :: GHC.Integer.Type.Integer
[GblId,
Str=DmdType,
Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=True,
ConLike=True, WorkFree=True, Expandable=True,
Guidance=IF_ARGS [] 100 0}]
Test.test1 = __integer 5
Test.test :: GHC.Integer.Type.Integer
[GblId,
Str=DmdType,
Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=True,
ConLike=True, WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(unsat_ok=True,boring_ok=True)}]
Test.test =
Test.test1
`cast` (<GHC.TypeLits.NTCo:SingI> <GHC.TypeLits.Nat> <5> ; (<GHC.TypeLits.TFCo:R:SingNatn
<5>> ; <GHC.TypeLits.NTCo:R:SingNatn
<5>>)
:: GHC.TypeLits.SingI GHC.TypeLits.Nat 5
~#
GHC.Integer.Type.Integer)
這是代碼的等效和Test.test = __integer 5
值將在編譯時被計算或不?
主要開銷 - 開發人員可以在不通知所有人的情況下輕鬆更改內部庫的行爲。 – viorior