Deriving Functor-like classes should unify kind variables
authorRyanGlScott <ryan.gl.scott@gmail.com>
Mon, 11 Apr 2016 00:53:23 +0000 (02:53 +0200)
committerBen Gamari <ben@smart-cactus.org>
Mon, 11 Apr 2016 00:53:24 +0000 (02:53 +0200)
commitaadde2b90817c577336da0d4a10ea47551d60c7e
tree09840461f8c98180b486b34f68d8c97a210113bb
parent8b57cac5974c9fffccbcae3104b5b5d18760749e
Deriving Functor-like classes should unify kind variables

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
compiler/typecheck/TcDeriv.hs
libraries/base/Data/Functor/Compose.hs
testsuite/tests/deriving/should_compile/T10561.hs
testsuite/tests/deriving/should_compile/T10561.stderr [deleted file]
testsuite/tests/deriving/should_compile/all.T