当我尝试使用Haskell类型,并试图获得->
类型的时候,这就出现了:
$ ghci
...
Prelude> :k (->)
(->) :: ?? -> ? -> *
Prelude>
而不是预期的* -> * -> *
。
??
和?
的内容是什么?它们是指具体类型还是“实物变量”?或其他什么?
答案 0 :(得分:96)
这些是Haskell类系统的GHC特定扩展。 Haskell 98报告specifies only a simple kind system:
...类型表达式被分类 分为不同的类型 有两种可能的形式:
符号*代表的种类 所有的nullary类型构造函数。如果是k1 并且k2是种类,则k1-> k2是 一种类型的类型 k1并返回一种类型k2。
GHC extends this system具有一种类型的子类型,允许unboxed types,并允许函数构造者在各种类型上具有多态性。 GHC支持的晶格是:
?
/\
/ \
?? (#)
/ \
* #
Where: * [LiftedTypeKind] means boxed type
# [UnliftedTypeKind] means unboxed type
(#) [UbxTupleKind] means unboxed tuple
?? [ArgTypeKind] is the lub of {*, #}
? [OpenTypeKind] means any type at all
中定义
特别是:
> error :: forall a:?. String -> a
> (->) :: ?? -> ? -> *
> (\\(x::t) -> ...)
最后一个例子t :: ??
中的位置(即不是未装箱的元组)。因此,引用GHC的话说,“在类型层面上存在一些小的分类”。
对于感兴趣的灵魂,GHC还支持强制类型和种类(“类型级别术语,作为类型平等的证据”,根据System Fc的需要),用于GADT,新类型和类型族。