
In response to comment:5: Despite appearances to the contrary, `Coercible` is '''not''' a class. It is much more a special operator, right along the lines of `~`.
(Historical note: when we started developing the idea that became `Coercible`, we thought it would indeed be a normal class, but with compiler-generated instances. And it started life that way. But when
#10715: Possible regression in Coercible a (X a) between 7.8 and 7.10 -------------------------------------+------------------------------------- Reporter: inaki | Owner: goldfire Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: GHC rejects | Unknown/Multiple valid program | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by inaki): Replying to [comment:7 goldfire]: pushed, the limitations of the class-based solver became too much, and so `Coercible` evolved. The code in GHC that solves `Coercible` constraints is closely tied to solving of normal equality constraints, and not at all related to the code that solves class constraints.)
Perhaps the user manual should be updated to reflect this fact about
`Coercible`. Thanks for the explanation! An explanation of the subtleties when using Coercible in the manual would certainly help. Another related counterintuitive fact is that coerce itself works fine with the recursive newtype, the following works: {{{#!hs import Data.Coerce (coerce, Coercible) data X a --doCoerce :: Coercible a (X a) => a -> X a --doCoerce = coerce newtype Y = Y (X Y) test :: Y -> X Y test = coerce }}} but it see no way of writing doCoerce in a way that makes ghc 7.10 happy. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10715#comment:10 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler