为什么Type是有值的类型?
Why is Type the kind of types with values?
如果我启用 MagicHash
,那么我有未提升的值,例如 42#
类型为 Int#
。
现在如果Type
is the kind of types with values,那么Int#
的种类应该是Type
,但不是因为Type
是TYPE '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))
。
如果我启用 MagicHash
,那么我有未提升的值,例如 42#
类型为 Int#
。
现在如果Type
is the kind of types with values,那么Int#
的种类应该是Type
,但不是因为Type
是TYPE '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))
。