Skip to content
  • Ryan Scott's avatar
    Deriving Functor-like classes should unify kind variables · aadde2b9
    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
    aadde2b9