为什么Type是有值的类型?

Why is Type the kind of types with values?

如果我启用 MagicHash,那么我有未提升的值,例如 42# 类型为 Int#

现在如果Type is the kind of types with values,那么Int#的种类应该是Type,但不是因为TypeTYPE 'LiftedRep的同义词而 Int# 的类型是 TYPE 'IntRep。我们可以在 ghci,

中轻松确认这一点
Prelude> :set -XMagicHash -XKindSignatures
Prelude> :m +Data.Kind GHC.Prim
Prelude Data.Kind GHC.Prim> :k (Int# :: Type)

<interactive>:1:2: error:
    • Expecting a lifted type, but ‘Int#’ is unlifted
    • In the type ‘(Int# :: Type)’

难道我们不把42#这样的魔法字面值当作值吗?

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

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

这是一个未提升的 Int,这与我们对名称 Int#.

的期望大致相同

事实证明这确实是文档和 GHC 的 HEAD 中 is now fixed 的缺陷。

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