On Wed, Mar 18, 2009 at 10:37 PM, Chung-chieh Shan <span dir="ltr">&lt;<a href="mailto:ccshan@post.harvard.edu">ccshan@post.harvard.edu</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;">
You make an important point that sharing is changed only if the variable<br>
(such as x0) is used more than once in the body.  Let me note that the<br>
definition of &quot;computation&quot; doesn&#39;t have to mention &quot;x0&quot; multiple times<br>
syntactically for x0 to be used more than once.  It&#39;s enough for &quot;x0&quot; to<br>
appear once under a lambda.  Here&#39;s a concrete example:<br>
<br>
    main :: IO ()<br>
    main = once &gt;&gt; once<br>
<br>
    once :: IO ()<br>
    once = do<br>
        putStrLn &quot;foo&quot;<br>
        putStrLn (unsafePerformIO (putStrLn &quot;hello&quot;) `seq` &quot;world&quot;)<br>
<br>
If I put &quot;() &lt;-&quot; in front of the second-to-last line, then &quot;hello&quot;<br>
appears twice, not once, in the output.</blockquote><div><br>You&#39;re right.  Of course, now you&#39;re in the compiler&#39;s territory.  If you compile the () &lt;- version with optimizations, the unsafePerformIO is lifted out and &quot;hello&quot; is again only printed once.  So yes, to ensure sharing under a lambda, it&#39;s safest to use an explicit let/where clause.<br>
<br>Luke</div></div>