
#15347: QuantifiedConstraints: Implication constraints with type families don't work -------------------------------------+------------------------------------- Reporter: aaronvargo | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 8.5 checker) | Keywords: Resolution: | QuantifiedConstraints Operating System: Unknown/Multiple | Architecture: Type of failure: GHC rejects | Unknown/Multiple valid program | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by aaronvargo): Replying to [comment:14 simonpj]: Yes, sorry!
That is, so far I do not understand why floating out type families (a straightforward source-to-source transformation that does not change the number of class parameters) would sacrifice a major benefit.
It requires changing the number of class parameters when the quantified constraint appears as a superclass. Suppose we would like to write: {{{#!hs class (forall a. Eq a => Eq (F t a)) => C t where type F t :: * -> * }}} where the type family `F t` in the quantified constraint is independent of the quantified `a`. In order to float this type family out, we need to add a new parameter to the class, `ft`, and make it equal to `F t`: {{{#!hs class (ft ~ F t, forall a. Eq a => Eq (ft a)) => C ft t where type F t :: * -> * }}} Furthermore, this parameter can never be instantiated with a type family without once again breaking the quantified constraint. E.g. if we write {{{#!hs class C (F t) t => D t }}} then the inherited quantified constraint will contain a type family, and will no longer work. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15347#comment:15 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler