[GHC] #13443: Typeclass resolution errors quite puzzling
GHC
ghc-devs at haskell.org
Sat Mar 18 07:48:17 UTC 2017
#13443: Typeclass resolution errors quite puzzling
-------------------------------------+-------------------------------------
Reporter: tomjaguarpaw | Owner: (none)
Type: feature | Status: new
request |
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.1
(Type checker) |
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
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?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13443>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list