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 (cherry picked from commit aadde2b9)
Showing
- compiler/typecheck/TcDeriv.hs 115 additions, 41 deletionscompiler/typecheck/TcDeriv.hs
- libraries/base/Data/Functor/Compose.hs 1 addition, 6 deletionslibraries/base/Data/Functor/Compose.hs
- testsuite/tests/deriving/should_compile/T10561.hs 0 additions, 14 deletionstestsuite/tests/deriving/should_compile/T10561.hs
- testsuite/tests/deriving/should_compile/T10561.stderr 0 additions, 7 deletionstestsuite/tests/deriving/should_compile/T10561.stderr
- testsuite/tests/deriving/should_compile/all.T 1 addition, 1 deletiontestsuite/tests/deriving/should_compile/all.T
Loading
Please register or sign in to comment