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

Reply via email to