Hi,

If I compile and run the code below, the file "foo" contains 10 lines
of output (as I would expect), but the file "bar" contains just 9 -
the final line is missing.  If I add a "join", as in the comment, then
all 10 lines appear.

I don't understand why, completely - my best guess is that it's
related laziness and the final result of the fold not being used.
However, in that case, I'm worried that the "join fix" isn't
guaranteed to work.

Please could someone explain what is happening and how I should
guarantee that the output is "complete".

Thanks,
Andrew

$ cat test.hs

main :: IO()
main = do h <- openFile "foo" WriteMode
          foldM (printer h) 1 [1..10]
          hClose h
          h <- openFile "bar" WriteMode
          foldM (liftM2 (printer h)) (return 1) $ map return [1..10]
--          join $ foldM (liftM2 (printer h)) (return 1) $ map return [1..10]
          hClose h

printer :: Handle -> Int -> Int -> IO Int
printer h n i = do hPutStr h (show n)
                   hPutStr h ":"
                   hPutStr h (show i)
                   hPutStr h "\n"
                   return (n+1)

$ ghc test.hs
$ ./a.out
$ diff foo bar
10d9
< 10:10

-- 
personal web site: http://www.acooke.org/andrew
personal mail list: http://www.acooke.org/andrew/compute.html
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to