Haskell GHC-TypeLits开销

Haskell GHC-TypeLits开销,haskell,ghc,Haskell,Ghc,使用Singfrom是否有任何开销?例如,对于该计划: {-# 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&

使用
Sing
from是否有任何开销?例如,对于该计划:

{-# 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.test1::GHC.Integer.Type.Integer
[GblId,
Str=DmdType,
Unf=Unf{Src=,TopLvl=True,Arity=0,Value=True,
ConLike=True,WorkFree=True,Expandable=True,
指导=如果参数[]100 0}]
Test.test1=\uuuu整数5
Test.Test::GHC.Integer.Type.Integer
[GblId,
Str=DmdType,
Unf=Unf{Src=,TopLvl=True,Arity=0,Value=True,
ConLike=True,WorkFree=True,Expandable=True,
指导=始终\u如果(unsat\u ok=True,无聊的\u ok=True)}]
测试=
Test.test1
`铸造`(;(;)
::GHC.TypeLits.SingI GHC.TypeLits.Nat 5
~#
GHC.Integer.Type.Integer)

此代码是否等效于
Test.Test=\uu integer 5
,值是否将在编译时计算?

是的,这等效于
Test.Test=\uu integer 5
cast部分只是类型系统噪声(你可以阅读马丁·苏尔兹曼、曼努埃尔·M·T·查克拉瓦蒂、西蒙·佩顿·琼斯和凯文·唐纳利的论文中的意思)。相关引用:

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


编辑:实际上,使用GHC 7.6 for
test=fromSing(sing::sing 5)
不同于
test=5
的代码,显然存在一些开销,但这个问题似乎在HEAD中得到了解决。

主要开销-开发人员可以在不通知任何人的情况下轻松更改内部库的行为。