<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">#3 is true for Haskell, it's just that when your function call appears in two different places, it is counted as two different expressions. &nbsp;Each separate expression will only be evaluated once, though. &nbsp;This is what is really meant, since the alternative --- i.e., no function ever being called more than once for a given set of arguments --- is way too cumbersome to be worth doing in practice for any language.<div><br></div><div>Laziness really means that if you have, say,</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>f x = (g 7) + x</div><div><br></div><div>then g 7 need only be evaluated at the first call to f, and then after that it can be cached. &nbsp;In some circumstances, if we had</div><div><br></div><div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>f x = (g 7) + x</div><div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>h&nbsp;x = (g 7) * x</div><div><br></div><div>Then maybe the compiler would decide not only to evaluate each (g 7) expression once, but also that the two expression should be merged into references to a single shared expression. &nbsp;However, this is not required for laziness; &nbsp;the only requirement there is that each expression separately only be evaluated once.</div></div></div><div><div><br></div><div>Cheers,</div><div>Greg<br><div><br></div><div><br><div><div>On Dec 15, 2009, at 9:58 PM, michael rice wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="top" style="font: inherit;">Hi all,<br><br>I think this (#3 below) is where I got the idea:<br><br><a href="http://en.wikipedia.org/wiki/Lazy_evaluation">http://en.wikipedia.org/wiki/Lazy_evaluation</a><br><br>Excerpt:<br><br>---------------<br><br>Lazy evaluation refers to how expressions are evaluated when they are passed as arguments to functions and entails the following three points:[1]<br><br>&nbsp;&nbsp; 1. The expression is only evaluated if the result is required by the calling function, called delayed evaluation.[2]<br>&nbsp;&nbsp; 2. The expression is only evaluated to the extent that is required by the calling function, called Short-circuit evaluation.<br>&nbsp;&nbsp; 3. the expression is never evaluated more than once, called applicative-order evaluation.[3]<br><br>---------------<br><br>So, I guess #3 doesn't apply to Haskell, or maybe I just misunderstood the meaning of the statement. I assumed that if f(p) = q (by some
 calculation) then that calculation would be replaced by q so the next time the function was called it could just return q, as occurs in memoization.<br><br>Michael<br><br><br><br>--- On <b>Tue, 12/15/09, Gregory Crosswhite <i>&lt;gcross@phys.washington.edu&gt;</i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Gregory Crosswhite &lt;gcross@phys.washington.edu&gt;<br>Subject: Re: [Haskell-cafe] Haskell and "memoization"<br>To: "Daniel Fischer" &lt;daniel.is.fischer@web.de&gt;<br>Cc: haskell-cafe@haskell.org<br>Date: Tuesday, December 15, 2009, 11:47 PM<br><br><div class="plainMail">Hmm, you raise an <br>On Dec 15, 2009, at 8:28 PM, Daniel Fischer wrote:<br><br>&gt; Am Mittwoch 16 Dezember 2009 05:08:39 schrieb Gregory Crosswhite:<br>&gt; <br>&gt; Not even then, necessarily. And it's not always a good idea.<br>&gt; <br>&gt; f k = [1 .. 20^k]<br>&gt; <br><br>You raise a really good
 point here.&nbsp; One can force sharing, as I understand it, by using a let clause:<br><br>n =<br>&nbsp;&nbsp;&nbsp; let xs = f 20<br>&nbsp;&nbsp;&nbsp; in length (xs ++ xs)<br><br>If I understand correctly, this should cause xs to be first evaluated, and then cached until the full length is computed, which in this case is obviously undesirable behavior.<br><br>Cheers,<br>Greg<br><br>_______________________________________________<br>Haskell-Cafe mailing list<br><a ymailto="mailto:Haskell-Cafe@haskell.org" href="x-msg://881/mc/compose?to=Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br><a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br></div></blockquote></td></tr></tbody></table><br>



      </blockquote></div><br></div></div></div></body></html>