<html><head></head><body><div class="gmail_quote">On 2 February 2016 7:22:31 AM AEDT, "Wojtek NarczyƄski" <wojtek@power.com.pl> wrote:<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">On 01.02.2016 20:19, Imants Cekusins wrote:<br /><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;"> in<br /> instance (Eq a, Eq q, Typeable a, Typeable q, AtmAcct a, Against q) =><br />      Match a q where<br /><br /> ANY is q<br /> because<br /> instance Against ANY</blockquote><br /><br />But I require q to be Eq and Typeable, and ANY is none of those two?<br /></pre></blockquote></div><br clear="all">But there *could* be other instances the compiler just can't see at the moment (because it's in another module that's not imported). Someone else could then import this module and that other module and observe inconsistent instances.<br>
<br>
To avoid that problem, the type class system *never* commits to "negative" information; if an instance choice is only valid because there *isn't* a possible instance in scope then that instance choice is not valid after all.<br>
<br>
A consequence is that constraints on an instance have to be ignored when choosing an instance (they still might make the choice be an error after it is chosen, but they don't affect which instance is selected). And so an instance like:<br>
<br>
... => Match a q<br>
<br>
is the *only* possible instance you can write, since it will match everything regardless of the ... (unless you use overlapping instances).</body></html>