Skip to content

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?

Edited by Ben Gamari
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information