[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