[GHC] #13443: Typeclass resolution errors quite puzzling

GHC ghc-devs at haskell.org
Mon Mar 19 21:53:57 UTC 2018


#13443: Typeclass resolution errors quite puzzling
-------------------------------------+-------------------------------------
        Reporter:  tomjaguarpaw      |                Owner:  (none)
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler (Type    |              Version:  8.0.1
  checker)                           |
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Poor/confusing    |  Unknown/Multiple
  error message                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by bgamari):

 * milestone:  8.6.1 =>


Old description:

> 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?

New description:

 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):

 {{{#!hs
     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:

 {{{#!hs
     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?

--

Comment:

 Demilestoning as no one has stepped up to carry this out yet. Do ping if
 this sounds like the sort of project you would like to try.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13443#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list