[Haskell-cafe] Typeclass resolution errors quite puzzling
Damian Nadales
damian.nadales at gmail.com
Mon Aug 15 13:33:23 UTC 2016
On Mon, Aug 15, 2016 at 3:26 PM, Tom Ellis
<tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk> wrote:
> 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 would expect this error, since B does not implement equality. Maybe
you're expecting Haskell to automatically derive an Eq B instance, but
that is not the behavior I would want, since data definitions could
implicitly define instances for other data types.
Is there any reason why you don't define:
data B = B deriving Eq?
> 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
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
More information about the Haskell-Cafe
mailing list