[Haskell-cafe] Instance match surprise

Tom Ellis tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk
Mon Feb 1 20:29:51 UTC 2016


On Mon, Feb 01, 2016 at 07:53:32PM +0100, Wojtek Narczyński wrote:
> Why does the first instance match? ANY is neither Eq nor Typeable. I
> thought I had some basic understanding of type classes, and now
> this...

> minimatch.hs:21:6: error:
>     • Overlapping instances for Match A130 ANY
>         arising from a use of ‘match’
>       Matching instances:
>         instance (Eq a, Eq q, Typeable a, Typeable q, AtmAcct a,
>                   Against q) =>
>                  Match a q
>           -- Defined at minimatch.hs:18:10
>         instance AtmAcct a => Match a ANY -- Defined at minimatch.hs:19:10
>     • In the expression: match A130 ANY
>       In an equation for ‘m1’: m1 = match A130 ANY

The way instance resolution works is somewhat counterintuitive, and it took
me a long time to get my head around it.  The upshot is that the instance
context is *absolutely irrelevant* when looking for a matching instance.

The type is

    Match A130 ANY

The instances in scope are 

    (Eq a, Eq q, Typeable a, Typeable q, AtmAcct a, Against q) => Match a q

and

    AtmAcct a => Match a ANY

But because the instance contexts are irrelevant, these are just

    ... => Match a q

and

    ... => Match a ANY

Both of these match 'Match A123 ANY', and thus you have overlap.

If you want to know *why* the instance contexts are ignored then you'll have
to ask someone who knows more about Prolog :)

Tom


More information about the Haskell-Cafe mailing list