On Wed, Mar 18, 2009 at 6:21 AM, Chung-chieh Shan <ccshan@post.harvard.edu> wrote:
Sebastiaan Visser <sfvisser@cs.uu.nl> wrote in article <D86A7D11-F95F-4A27-A13C-2D78AFDA2E02@cs.uu.nl> in gmane.comp.lang.haskell.cafe:
> Suppose I have a list of IO computations that depends on a few very
> time consuming pure operations. The pure operations are not dependent
> on the real world:
>
>  >  computation :: [IO Int]
>  >  computation = [
>  >      smallIOfunc timeConsumingPureOperation0
>  >    , smallIOfunc timeConsumingPureOperation1
>  >    , smallIOfunc timeConsumingPureOperation2
>  >    , smallIOfunc timeConsumingPureOperation3
>  >    ]
>  >    where smallIOfunc a = print a >> return a

I take it that, because you "do not really have the control to change
things `deep' inside the code", it is not an option to redefine

   computation = [
       smallIOfunc x0
     , smallIOfunc x1
     , smallIOfunc x2
     , smallIOfunc x3
     ]
     where smallIOfunc a = print a >> return a
           x0 = timeConsumingPureOperation0
           x1 = timeConsumingPureOperation1
           x2 = timeConsumingPureOperation2
           x3 = timeConsumingPureOperation3

Um, just to clarify, this code is exactly equivalent to the original, including sharing behavior.  The only time a let (or where) clause changes sharing is if the variable is used more than once in the body.

Luke