
#8356: Strangeness with FunDeps ----------------------------------------------+---------------------------- Reporter: ksf | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.7 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: GHC rejects valid program | Unknown/Multiple Test Case: | Difficulty: Unknown Blocking: | Blocked By: | Related Tickets: ----------------------------------------------+---------------------------- Comment (by rwbarton): The error makes sense to me: `sy`, `a`, `b` and `((sy ::: a) ': xs)` do not jointly determine `((sy ::: b) ': ys)`, because the whole `ys` part is free. (And the same for the other fundep.) Perhaps the error message could be more specific, saying what I said above? something like {{{ Illegal instance declaration for [...] Multiple uses of this instance may be inconsistent with the functional dependencies of the class: `sy', `a', `b' and `((sy ::: a) ': xs)' do not jointly determine `((sy ::: b) ': ys)' }}} Extra clarity would be good here since there are existing libraries that use fundeps incorrectly, that will stop compiling in 7.8, and I anticipate a slew of bug reports otherwise. See for example http://ghc.haskell.org/trac/ghc/ticket/1241#comment:22.
What I'm trying to do is to express "xs is ys and ys is xs with a and b interchanged at sy", all in a single predicate because my current type family implementation needs two and explodes the inferred types.
In that case, perhaps you intended {{{ instance Replaced sy a b ((sy ::: a) ': xs) ((sy ::: b) ': xs) -- note xs twice }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8356#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler