
#9443: Regression from 7.6.3 to 7.8.3: could not coerce because argument "has role Nominal" -------------------------------------+------------------------------------- Reporter: bernalex | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.3 Resolution: | Keywords: Operating System: | Architecture: x86_64 (amd64) Unknown/Multiple | Difficulty: Unknown Type of failure: GHC | Blocked By: rejects valid program | Related Tickets: Test Case: | Blocking: | Differential Revisions: | -------------------------------------+------------------------------------- Comment (by goldfire): I don't think this is a bug, but I suppose I could be convinced otherwise. Consider this: {{{#!hs class C a where meth :: D a => a -> a }}} Note that the constraint on `meth` is ''not'' `C a`, but some other class `D a`. If we wish to derive an instance of `C` via GND, the derived instance will use the exact same implementation of `meth` as does the original instance. BUT, the newtype (say, `Year a`) may have a ''different'' instance for `D` compared to the representation type (`Integer`). So, reusing the old implementation would be bogus. That's why class parameters default to have nominal roles. Of course, if we knew that the `D` instances were in fact the same, then the derivation makes good sense. But GHC doesn't track "instance equality" (which could just mean that one instance is the GND of the other). In the case presented here, the instance equality is guaranteed, as we're performing the GND to make the instances equal. However, detecting this, in general, is hard, and this seems like enough of a corner case to let it go unfixed. Does that explain it? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9443#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler