
It's simple. Consider {{{ class C v where type T a b v cd }}} In any instance declaration, the type in the `v` position of the `type` instance must be the same as in the instance header: {{{ instance ... => C ty where type T p q ty r s = <rhs> }}} I think we do (or at least should) also insist that `p`, `q`, `r`, `s` are distinct type variables, otherwise the type instance is more specific
#11450: Associated types at wrong type in instance -------------------------------------+------------------------------------- Reporter: simonpj | Owner: Type: bug | Status: new Priority: high | Milestone: 8.0.1 Component: Compiler | Version: 7.10.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by RyanGlScott): Replying to [comment:8 simonpj]: than the class instance, but that's a separate matter. Thank you for a formal description of what's going on, but I'm still confused about how this should behave w.r.t. wildcards. By the above rules, if you have {{{#!hs class Warning a where type T a instance Warning (Either a b) where ... }}} Then we'd have to do something like this: {{{#!hs instance Warning (Either a b) where type T (Either a b) = a }}} But this results in a warning on GHC 8.0! {{{ Defined but not used: type variable ‘b’ }}} And if you changed `b` to `_`, it would no longer follow the rules described above. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11450#comment:11 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler