Typeclass resolution errors quite puzzling
This ticket is based on a post I made to haskell-cafe: https://mail.haskell.org/pipermail/haskell-cafe/2016-August/124622.html
Here's a program with an odd error message (GHC 8.0.1):
data A a = A a deriving Eq
data B = B
main :: IO ()
main = print (A B == A B)
test/main.hs:5:15: error:
• No instance for (Eq B) arising from a use of ‘==’
• In the first argument of ‘print’, namely ‘(A B == A B)’
In the expression: print (A B == A B)
In an equation for ‘main’: main = print (A B == A B)
I get an error about Eq B
even though it's Eq A
that is manifestly required at the call site. This error is odder when A
and B
are defined far away from the use of ==
.
This is even odder:
data A a = A a
data B = B
instance Ord a => Eq (A a) where
main :: IO ()
main = print (A B == A B)
test/main.hs:7:15: error:
• No instance for (Ord B) arising from a use of ‘==’
• In the first argument of ‘print’, namely ‘(A B == A B)’
In the expression: print (A B == A B)
In an equation for ‘main’: main = print (A B == A B)
Now not only is the type puzzling (B
instead of A
) but the *class* is puzzling (Ord
instead of Eq
). This occurred to me in practice because Data.Graph.Inductive.PatriciaTree.Gr
has (Eq a, Ord b) => Eq (Gr a b)
.
It would have been a lot more helpful to see
* No instance for (Ord B)
* arising from (Eq A)
* arising from the use of '=='
Does anyone agree with me that GHC should produce the full trace when it fails to resolve instances rather than just the proximal failure?