Haskell Weird种类:种类( - >)是?? - > ? - > *

时间:2010-06-13 23:15:09

标签: haskell types type-systems

当我尝试使用Haskell类型,并试图获得->类型的时候,这就出现了:

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

而不是预期的* -> * -> *???的内容是什么?它们是指具体类型还是“实物变量”?或其他什么?

1 个答案:

答案 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

ghc/compiler/types/Type.lhs

中定义

特别是:

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

最后一个例子t :: ??中的位置(即不是未装箱的元组)。因此,引用GHC的话说,“在类型层面上存在一些小的分类”。

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

相关问题