On 01/03/07, Dave Tapley <[EMAIL PROTECTED]> wrote:
My question asks why this is the case, when laziness should ensure only the first 10 cases need to be computed.
Just to clarify some of the other answers you've got. Saying the IO monad is strict isn't the whole picture, after all 'do {txt <- getContents; putStrLn $ transform txt}' doesn't read all the contents in before transforming it. The reason your program hangs is that you are trying to return an infinite list generated from an _infinite sequence of IO actions_. This example might help:
getList1, getList2, getList3 :: IO [Int] getList1 = return . repeat $ 0 getList2 = do {lst <- getList2; return $ 0 : lst} getList3 = sequence . repeat . return $ 0
main = do lst <- getList1 putStrLn . show . take 10 $ lst
getList1 will work in the lazy way that you expected. getList2 and getList3 are equivalent to each other and similar to your iterateM, they will loop forever. I hope this helps, - Joe _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell