• Ryan Scott's avatar
    Deriving Functor-like classes should unify kind variables · 9c48d8a0
    Ryan Scott authored
    While the deriving machinery always unifies the kind of the typeclass
    argument with the kind of the datatype, this proves not to be sufficient
    to produce well kinded instances for some poly-kinded datatypes. For
    newtype Compose (f :: k2 -> *) (g :: k1 -> k2) (a :: k1)
      = Compose (f (g a)) deriving Functor
    would fail because only `k1` would get unified with `*`, causing the
    ill kinded instance to be generated:
    instance (Functor (f :: k2 -> *), Functor (g :: * -> k2)) =>
      Functor (Compose f g) where ...
    To prevent this, we need to take the subtypes and unify their kinds with
    `* -> *`.
    Fixes #10524 for good.
    Test Plan: ./validate
    Reviewers: simonpj, hvr, austin, bgamari
    Subscribers: thomie
    Differential Revision: https://phabricator.haskell.org/D2097
    GHC Trac Issues: #10524, #10561
    (cherry picked from commit aadde2b9)
TcDeriv.hs 99.2 KB