Re: Doing IO in foldr repeats lines?

2001-01-23 Thread Andreas Rossberg

Ian Lynagh wrote:
> 
> > main :: IO()
> > main = do _ <- foldl foo (return 14) ["qq\n", "ww\n", "ee\n"]
> >   putStr ""
> 
> > foo :: IO Int -> String -> IO Int
> > foo io_l s = do l <- io_l
> > () <- putStr s
> > io_l
> 
> prints (with both GHC and hugs):
> 
> qq
> ww
> qq
> ee
> qq
> ww
> qq
> 
> and I really don't understand why. Is the code re-evaluated every time
> foldl is expanded or something?

Nobody seems to have answered yet, so I try to explain it.

Look at your definition of foo: it actually duplicates its argument
action io_l. For the first application io_l is (return 14). Let's call
that io_l0. The resulting action is

io_l1 = do { l <- return 14; () <- putStr "qq"; return 14 }

which is passed at the next application. The result is

io_l2 = do { l <- do { l <- return 14; () <- putStr "qq"; return 14 }
   ; () <- putStr "ww"
   ; do { l <- return 14; () <- putStr "qq"; return 14 }
   }

This can be reformulated as

io_l2'= do { l  <- return 14
   ; () <- putStr "qq"
   ; l  <- return 14
   ; () <- putStr "ww"
   ; l  <- return 14
   ; () <- putStr "qq"
   ; return 14
   }

And so on. Finally the complete action (io_l3) is executed by running
main and produces the output you observe.

Hope this helps,

- Andreas

-- 
Andreas Rossberg, [EMAIL PROTECTED]

:: be declarative. be functional. just be. ::

___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell



Re: Doing IO in foldr repeats lines?

2001-01-20 Thread Ian Lynagh

On Sat, Jan 20, 2001 at 05:08:48PM -0500, Scott Turner wrote:
> At 21:17 2001-01-20 +, Ian Lynagh wrote:
> > main = do _ <- foldl foo (return 14) ["qq\n", "ww\n", "ee\n"]
> >   putStr ""   
> >
> > foo :: IO Int -> String -> IO Int 
> > foo io_l s = do l <- io_l 
> > () <- putStr s
> > io_l  
> 
> It repeats lines
> >and I really don't understand why. Is the code re-evaluated every time
> >foldl is expanded or something?
> 
> Since the result type of foo is IO Int, it is building an IO action, in
> other words it is calculating a sequence of effects.  The combined effects
> are performed by main.

Thanks, a private mail showing the evaluation highlighted my stupidity
wonderfully  :-)

I now see what's going on and a return l instead of io_l as the last
line is what I wanted. The mixture of io_l and return bar also explains
why I was seeing really random looking output unlike the nice pattern
of the more minimal case  :-)


Thanks
Ian


___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell



Re: Doing IO in foldr repeats lines?

2001-01-20 Thread Scott Turner

At 21:17 2001-01-20 +, Ian Lynagh wrote:
> main = do _ <- foldl foo (return 14) ["qq\n", "ww\n", "ee\n"]
>   putStr ""   
>
> foo :: IO Int -> String -> IO Int 
> foo io_l s = do l <- io_l 
> () <- putStr s
> io_l  

It repeats lines
>and I really don't understand why. Is the code re-evaluated every time
>foldl is expanded or something?

Since the result type of foo is IO Int, it is building an IO action, in
other words it is calculating a sequence of effects.  The combined effects
are performed by main.

Repetition occurs due to the structure of foo.  Notice that its action
consists of first performing io_l, then putting a string, and then
performing io_l _again_.  If io_l prints the lines qq, ww, and qq, then the
result will involve two such triplets.

Try this.  Remove either of the occurrences of io_l from the do block, and
you will see quite different results.

--
Scott Turner
[EMAIL PROTECTED]   http://www.billygoat.org/pkturner

___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell



Doing IO in foldr repeats lines?

2001-01-20 Thread Ian Lynagh


Hi all

The following code:

> module Main (main) where  

> import IO 

> main :: IO()  
> main = do _ <- foldl foo (return 14) ["qq\n", "ww\n", "ee\n"]
>   putStr ""   

> foo :: IO Int -> String -> IO Int 
> foo io_l s = do l <- io_l 
> () <- putStr s
> io_l  

prints (with both GHC and hugs):

qq
ww
qq
ee
qq
ww
qq

and I really don't understand why. Is the code re-evaluated every time
foldl is expanded or something?


Thanks
Ian, confused


___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell