<br><br>
<div><span class="gmail_quote">On 12/4/07, <b class="gmail_sendername">Stefan O&#39;Rear</b> &lt;<a href="mailto:stefanor@cox.net">stefanor@cox.net</a>&gt; wrote:</span></div>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">When you see an expression of the form:<br><br>f a<br><br>you generally want to evaluate a before applying; but if a is _|_, this
<br>will only give the correct result if f a = _|_.&nbsp;&nbsp;Merely &#39;guaranteed to<br>evaluate&#39; misses out on some common cases, for instance ifac:<br><br>ifac 0 a = a<br>ifac n a = ifac (n - 1) (a * n)<br><br>ifac is guaranteed to either evaluate a, or go into an infinite loop -
<br>so it can be found strict, and unboxed.&nbsp;&nbsp;Whereas &#39;ifac -1 (error &quot;moo&quot;)&#39;<br>is an infinite loop, so using a definition based on evaluation misses<br>this case.</blockquote>
<div>&nbsp;</div>
<div>By this line:</div>
<div>you generally want to evaluate a before applying; but if a is _|_, this<br>will only give the correct result if f a = _|_</div>
<div>&nbsp;</div>
<div>I assume you mean that it&#39;s generally more efficient to do things that way, because the calling function may have more information about &quot;a&quot; or how it is calculated, so you may be able to optimize better by doing eager evaluation whenever it is correct.
</div>
<div>&nbsp;</div>
<div>Your ifac example makes perfect sense,&nbsp;thanks.</div>
<div>&nbsp;</div>
<div>&nbsp; -- ryan</div>