GHC TypeLits开销

时间:2013-09-26 06:24:25

标签: haskell ghc

使用GHC.TypeLits中的Sing是否有任何开销?例如,程序:

{-# 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,值是否将在编译时计算?

1 个答案:

答案 0 :(得分:3)

是的,这相当于Test.test = __integer 5cast部分只是类型系统噪音(你可以阅读Martin Sulzmann撰写的文章"System F with Type Equality Coercions"中的含义,Manuel MT Chakravarty ,Simon Peyton Jones和Kevin Donnelly)。相关报价:

  

投射表达式没有操作效果,但它们用于   当应该处理一种类型的值时,向类型系统解释   作为另一个。

修改:实际上,对于GHC 7.6,test = fromSing (sing :: Sing 5)的{​​{3}}与test = 5的代码不同,显然实际上一些开销,但这个问题似乎在HEAD修复。