• 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
    example:
    
    ```
    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
    following
    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)
    9c48d8a0
TcDeriv.hs 99.2 KB