• batterseapower's avatar
    Implement -XConstraintKind · 9729fe7c
    batterseapower authored
    Basically as documented in http://hackage.haskell.org/trac/ghc/wiki/KindFact,
    this patch adds a new kind Constraint such that:
      Show :: * -> Constraint
      (?x::Int) :: Constraint
      (Int ~ a) :: Constraint
    And you can write *any* type with kind Constraint to the left of (=>):
    even if that type is a type synonym, type variable, indexed type or so on.
    The following (somewhat related) changes are also made:
     1. We now box equality evidence. This is required because we want
        to give (Int ~ a) the *lifted* kind Constraint
     2. For similar reasons, implicit parameters can now only be of
        a lifted kind. (?x::Int#) => ty is now ruled out
     3. Implicit parameter constraints are now allowed in superclasses
        and instance contexts (this just falls out as OK with the new
        constraint solver)
    Internally the following major changes were made:
     1. There is now no PredTy in the Type data type. Instead
        GHC checks the kind of a type to figure out if it is a predicate
     2. There is now no AClass TyThing: we represent classes as TyThings
        just as a ATyCon (classes had TyCons anyway)
     3. What used to be (~) is now pretty-printed as (~#). The box
        constructor EqBox :: (a ~# b) -> (a ~ b)
     4. The type LCoercion is used internally in the constraint solver
        and type checker to represent coercions with free variables
        of type (a ~ b) rather than (a ~# b)