代码之家  ›  专栏  ›  技术社区  ›  Ming-Tang

哈斯克尔怪异的种类:有点(->)是吗??>?> >

  •  65
  • Ming-Tang  · 技术社区  · 14 年前

    当我尝试哈斯克尔的时候 -> 结果显示:

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

    而不是预期的 * -> * -> * . 什么是 ?? ? 东西?它们是指具体类型还是“种类变量”?或者别的什么?

    1 回复  |  直到 13 年前
        1
  •  96
  •   Don Stewart    14 年前

    这些是哈斯克尔类系统的GHC特定扩展。哈斯克尔98号报告 specifies only a simple kind system :

    …类型表达式已分类 分成不同种类,其中一种 两种可能的形式:

    符号*表示 所有空类型构造函数。如果K1 k2是种类,那么k1->k2是 有一种类型的类型 并返回一种类型的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 )用于小工具、新类型和类型族。

    推荐文章