Haskell奇怪的种类:种类( - >)是?? - >? - >*

Min*_*ang 65 haskell types type-systems

当我尝试Haskell种类,并试图获得那种->,并且这出现了:

$ ghci
...
Prelude> :k (->)
(->) :: ?? -> ? -> *
Prelude> 
Run Code Online (Sandbox Code Playgroud)

而不是预期的* -> * -> *.有什么???事情?它们是指具体类型还是"实物变量"?或者是其他东西?

Don*_*art 96

这些是Haskell类系统的GHC特定扩展.Haskell 98报告只指定了一个简单的系统:

...类型表达式分为不同的类型,它们采用两种可能的形式之一:

符号*表示所有nullary类型构造函数的种类.如果k1和k2是种类,则k1-> k2是采用类型k1并返回类型k2的类型.

GHC 以一种类型的子类型扩展了这个系统,允许未装箱的类型,并允许功能构造者在各种类型上具有多态性.格子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
Run Code Online (Sandbox Code Playgroud)

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

特别是:

> error :: forall a:?. String -> a
> (->)  :: ?? -> ? -> *
> (\\(x::t) -> ...)
Run Code Online (Sandbox Code Playgroud)

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

对于感兴趣的灵魂,GHC还支持强制类型和种类(GADT,newtypes和类型系列中使用的系统Fc所需的"类型级别术语,作为类型等式的证据" ).

  • 令人兴奋的是 - 在任何情况下,用户(而不是编译器实现者)可能关心/需要明确地利用这些盒装/非盒装类型的区别吗?从表面上看,它们似乎是编译器中用于优化的一些内部推理机制的抽象泄漏? (9认同)
  • 在新的GHC中,`(?)`和`(??)`被重命名为`OpenKind`和`ArgKind`,现在`( - >)::* - >* - >*`.http://www.haskell.org/pipermail/glasgow-haskell-users/2012-June/022435.html (7认同)
  • 如果您尝试编写使用"*"以外类型的函数,您会很在意 - 因为它们对您的编写方式有各种限制. (6认同)