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
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to