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所需的"类型级别术语,作为类型等式的证据" ).