
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