哈斯克尔奇怪的种类:( – >)的种类是? – >? – > *

当我尝试使用Haskelltypes并尝试获得类似的结果时,

 $ ghci ... Prelude> :k (->) (->) :: ?? -> ? -> * Prelude> 

而不是预期的* -> * -> * 。 什么是??? 事情呢? 它们是指具体types还是“类variables”? 或者是其他东西?

这些是Haskell类系统的GHC特定的扩展。 Haskell 98报告仅指定一个简单的types系统 :

…typesexpression式被分为不同types,它们采取两种可能的forms之一:

符号*表示所有空types构造函数的types。 如果k1和k2是种类,则k1-> k2是取typesk1并返回typesk2的types。

GHC通过一种forms的子types来扩展这个系统 ,允许拆箱types ,并允许函数构造器在多种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 

在ghc / compiler / types / Type.lhs中定义

尤其是:

 > error :: forall a:?. String -> a > (->) :: ?? -> ? -> * > (\\(x::t) -> ...) 

在最后一个例子t :: ?? (即不是一个未装箱的元组)。 所以,引用GHC的话来说,“在类的层面上有一个小分类”。

对于感兴趣的灵魂,GHC还支持在GADT,新型和types家族中使用的强制types和种类( 系统Fc需要的“作为types平等的证据的types级术语”)。