On Wed, Mar 18, 2009 at 10:37 PM, Chung-chieh Shan
<ccs...@post.harvard.edu>wrote:

> You make an important point that sharing is changed only if the variable
> (such as x0) is used more than once in the body.  Let me note that the
> definition of "computation" doesn't have to mention "x0" multiple times
> syntactically for x0 to be used more than once.  It's enough for "x0" to
> appear once under a lambda.  Here's a concrete example:
>
>    main :: IO ()
>    main = once >> once
>
>    once :: IO ()
>    once = do
>        putStrLn "foo"
>        putStrLn (unsafePerformIO (putStrLn "hello") `seq` "world")
>
> If I put "() <-" in front of the second-to-last line, then "hello"
> appears twice, not once, in the output.


You're right.  Of course, now you're in the compiler's territory.  If you
compile the () <- version with optimizations, the unsafePerformIO is lifted
out and "hello" is again only printed once.  So yes, to ensure sharing under
a lambda, it's safest to use an explicit let/where clause.

Luke
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to