Re: Non-monolithic version of 'sequence' for IO monad?
Mon, 05 Nov 2001 14:23:18 -0800, Joe English <jenglish@flightlab.com> 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. -- __("< Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/ \__/ ^^ QRCZAK
On Tue, Nov 06, 2001 at 12:09:58AM +0000, Marcin 'Qrczak' Kowalczyk wrote:
Mon, 05 Nov 2001 14:23:18 -0800, Joe English <jenglish@flightlab.com> 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 unsafeLazySequence = foldr (\m l -> unsafeInterleaveIO (liftM2 (:) m l)) (return []) -- Just a list of results of the actions, no ordering is guaranteed unsafeLazierSequence = foldr (\m l -> liftM2 (:) (unsafeInterleaveIO m) l) (return []) What, by the way, is the practical difference between unsafeInterleaveIO and (return . unsafePerformIO)? Lauri Alanko la@iki.fi
participants (2)
-
Lauri Alanko -
Marcin 'Qrczak' Kowalczyk