Doing IO in foldr repeats lines?

Ian Lynagh igloo@earth.li
Sat, 20 Jan 2001 22:25:18 +0000


On Sat, Jan 20, 2001 at 05:08:48PM -0500, Scott Turner wrote:
> At 21:17 2001-01-20 +0000, 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