Non-monolithic version of 'sequence' for IO monad?
Tue, 6 Nov 2001 02:53:13 +0200
On Tue, Nov 06, 2001 at 12:09:58AM +0000, Marcin 'Qrczak' Kowalczyk wrote:
> Mon, 05 Nov 2001 14:23:18 -0800, Joe English <firstname.lastname@example.org> pisze:
> > Is there any way, short of using unsafePerformIO,
> > to implement a combinator
> > f :: [IO a] -> IO [a]
> > in a way that the the result is produced lazily?
> No. If evaluation of list elements causes IO, then it's unsafe.
At least one can use unsafeInterleaveIO, which is marginally safer.
-- Result is evaluated as it is needed, but the internal ordering of the
-- sequenced actions is retained
= foldr (\m l -> unsafeInterleaveIO (liftM2 (:) m l)) (return )
-- Just a list of results of the actions, no ordering is guaranteed
= foldr (\m l -> liftM2 (:) (unsafeInterleaveIO m) l) (return )
What, by the way, is the practical difference between unsafeInterleaveIO
and (return . unsafePerformIO)?