On Thu, Mar 26, 2009 at 6:42 PM, Alexander Dunlap <span dir="ltr">&lt;<a href="mailto:alexander.dunlap@gmail.com">alexander.dunlap@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">On Thu, Mar 26, 2009 at 5:23 PM, wren ng thornton &lt;<a href="mailto:wren@freegeek.org">wren@freegeek.org</a>&gt; wrote:<br>
&gt; It&#39;s a static error, detectable statically, and yet it&#39;s deferred to the<br>
&gt; runtime. I&#39;d much rather the compiler catch my errors than needing to create<br>
&gt; an extensive debugging suite and running it after compilation. Is this not<br>
&gt; the promise of purity?<br>
<br>
</div>Ultimately, it&#39;s not detectable statically, is it? Consider<br>
<br>
import Control.Applicative<br>
<br>
main = do<br>
  f &lt;- lines &lt;$&gt; readFile &quot;foobar&quot;<br>
  print (head (head f))<br>
<br>
You can&#39;t know whether or not head will crash until runtime.</blockquote><div><br>Static checkers are usually conservative, so this would be rejected.  In fact, it&#39;s not always essential to depend on external information; eg. this program:<br>
<br>(\x y -&gt; y) (\x -&gt; x x) (\x -&gt; x)<br><br>Behaves just like the identity function, so surely it should have type a -&gt; a, but it is rejected because type checking is (and must be) conservative.<br><br>Keeping constraints around that check that head is well-formed is a pretty hard thing to do.  Case expressions are easier to check for totality, but have the disadvantages that wren mentions.  <br>
<br>Much as we would like to pressure the language to support static constraints, I don&#39;t think we are yet in a position to.  It&#39;s not the kind of thing you can just throw on and be done with it; see Conor McBride&#39;s current project for an example of the issues involved.<br>
<br>Luke</div></div>