<html><head></head><body><div class="gmail_quote">On 2 February 2016 9:33:46 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 21:34, Ben wrote:<br /><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;"> But there *could* be other instances the compiler just can't see at <br /> the moment (because it's in another module that's not imported). <br /> Someone else could then import this module and that other module and <br /> observe inconsistent instances.</blockquote><br /><br />Okay, I get it. In another module there might be instances Eq and <br />Typeable for ANY, and then the instances would indeed overlap. It makes <br />sense.<br /><br /><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;"> To avoid that problem, the type class system *never* commits to <br /> "negative" information; if an instance choice is only valid because <br /> there *isn't* a possible instance in scope then that instance choice <br /> is not valid after
all.</blockquote><br /><br />I will have to produce many instances by hand.<br /><br />Couldn't the compiler just postpone the its overlap checking until <br />linking? Or might I forbid creation of Eq and Typeable instances of ANY?<br /></pre></blockquote></div><br clear="all">It potentially could, but it didn't (the design isn't without tradeoffs).<br>
<br>
What you can do is look into overlapping instances; you can make the compiler allow those two instances to overlap and pick the most specific one that applies at each use site. It still wouldn't be actually using the constraints to choose the instance, but in code that statically knows its talking about Any it can use that instance, and if it's an unknown type variable you presumably *won't* be able to prove Typeable or Eq if it could possibly be Any, so the code still wouldn't compile.<br>
<br>
I have very rarely actually used this, because it can be a little "dangerous" (you can get those inconsistent instances the ignore-the-instance-constraints rule is designed to avoid), but with a little discipline it can work fine. Read up on the GHC documentation on the OverlappingInstances extension.</body></html>