[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