
Marc Weber wrote:
stefan has pointed me a nice version:
Anyway I'm curious why
============= ======================================================= randomInts :: IO [Int] randomInts = unsafeInterleaveIO $ sequence $ cycle [unsafeInterleaveIO randomIO] ============= =======================================================
doesn't return.
sequence isn't lazy (not in the IO monad at least); it will try to run to completion, returning an infinite list of (as yet unevaluated, due to unsafeInterleaveIO) thunks. The construction of that list will never finish though. I think you want something like (untested)
unsafeInterleaveSequence :: [IO a] -> IO [a] unsafeInterleaveSequence [] = return [] unsafeInterleaveSequence (x:xs) = unsafeInterleaveIO $ liftM2 (:) x (unsafeInterleaveSequence xs)
randomInts = unsafeInterleaveSequence $ repeat randomIO
or maybe (unsafeInterleaveIO randomIO) instead of randomIO. Bertram