Note [Newtype-deriving trickiness]
Consider (#12768): class C a where { op :: D a => a -> a } instance C a => C [a] where { op = opList } opList :: (C a, D [a]) => [a] -> [a] opList = ... Now suppose we try GND on this: newtype N a = MkN [a] deriving( C ) The GND is expecting to get an implementation of op for N by coercing opList, thus: instance C a => C (N a) where { op = opN } opN :: (C a, D (N a)) => N a -> N a opN = coerce @([a] -> [a]) @([N a] -> [N a] opList :: D (N a) => [N a] -> [N a] But there is no reason to suppose that (D [a]) and (D (N a)) are inter-coercible; these instances might completely different. So GHC rightly rejects this code.
References 0
This Note does not link to any other.
Referenced by 2
- Newtype-deriving instances GHC.Tc.Deriv.Generate
- GHC.Tc.Deriv.Generate call site