Haskell 为什么类型是有值的类型?

Haskell 为什么类型是有值的类型?,haskell,types,ghc,Haskell,Types,Ghc,如果我启用了MagicHash,那么我就有了类型为Int的未刷新值,例如42 现在如果,那么Int的类型应该是Type,但这不是因为Type是Type'LiftedRep的同义词,而Int的类型是Type'IntRep。我们可以在ghci中轻松确认这一点 Prelude>:set-XMagicHash-XKindSignatures 前奏曲>:m+Data.Kind GHC.Prim 前奏曲数据.Kind GHC.Prim>:k(Int#:::Type) :1:2:错误: •应为提升类型,但“I

如果我启用了
MagicHash
,那么我就有了类型为
Int
的未刷新值,例如
42

现在如果,那么
Int
的类型应该是
Type
,但这不是因为
Type
Type'LiftedRep
的同义词,而
Int
的类型是
Type'IntRep
。我们可以在ghci中轻松确认这一点

Prelude>:set-XMagicHash-XKindSignatures
前奏曲>:m+Data.Kind GHC.Prim
前奏曲数据.Kind GHC.Prim>:k(Int#:::Type)
:1:2:错误:
•应为提升类型,但“Int#”未提升
•在类型“(Int#::type)”中

那么,我们是否不将诸如
42#
之类的神奇文字视为值呢?

只要省略类型签名,GHCI就会高兴地告诉您:

Prelude Data.Kind GHC.Prim> :k Int#
Int# :: TYPE 'GHC.Types.IntRep

这是一个未升级的Int,这与我们从名称
Int#

中所期望的差不多。事实证明,这确实是文档和GHC头脑中的一个缺陷


总之,
Type
是具有提升值的类型,因为还有其他类型不同的值,例如
42::(Int::Type'IntRep))

据我所知,我的反对意见是
Type
是一种值,其中
42.
在我看来像是一个值。@Madgen这是一个未提升的值,编译器对它的处理与提升值的处理不同,因此具有不同的类型
Int#
根本不是
类型
“那么,我们不把42这样的神奇文字视为值,这是不是很愚蠢/没用的说法?”。因此,我认为对
Type
的评论是不准确的。
42#
确实是有价值的。如果您认为文档可以改进,您可以向GHC提出一个问题。我相信“有值的类型类型”短语主要用于反对“不完整”类型,如
可能
Int
,或类型级结构,如
”[Int,Bool,Char]
,这(在当前的Haskell中)没有术语级别的值。如果我们包括像
TYPE'IntRep
这样的类型,则该短语不再正确。