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. 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 p.turner@computer.org http://www.billygoat.org/pkturner