[Haskell-cafe] Typeclass resolution errors quite puzzling
Tom Ellis
tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk
Mon Aug 15 13:26:23 UTC 2016
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?
Tom
More information about the Haskell-Cafe
mailing list