Haskell Weird Kinds: Kind of (->) is ?? -> ? -> *

前端 未结 1 1047
长情又很酷
长情又很酷 2020-12-07 14:26

When I was experimenting with Haskell kinds, and trying to get the kind of ->, and this showed up:

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


        
相关标签:
1条回答
  • 2020-12-07 15:25

    These are GHC-specific extensions of the Haskell kind system. The Haskell 98 report specifies only a simple kind system:

    ... type expressions are classified into different kinds, which take one of two possible forms:

    The symbol * represents the kind of all nullary type constructors. If k1 and k2 are kinds, then k1->k2 is the kind of types that take a type of kind k1 and return a type of kind k2.

    GHC extends this system with a form of kind subtyping, to allow unboxed types, and to allow the function construtor to be polymorphic over kinds. The kind lattice GHC supports is:

                 ?
                 /\
                /  \
              ??   (#)
              / \     
             *   #     
    
    Where:       *   [LiftedTypeKind]   means boxed type
                 #   [UnliftedTypeKind] means unboxed type
                (#)  [UbxTupleKind]     means unboxed tuple
                ??   [ArgTypeKind]      is the lub of {*, #}
                ?    [OpenTypeKind]     means any type at all
    

    Defined in ghc/compiler/types/Type.lhs

    In particular:

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

    Where in the last example t :: ?? (i.e. is not an unboxed tuple). So, to quote GHC, "there is a little subtyping at the kind level".

    For interested souls, GHC also supports coercion types and kinds ("type-level terms which act as evidence for type equalities", as needed by System Fc) used in GADTs, newtypes and type families.

    0 讨论(0)
提交回复
热议问题