[Haskell-cafe] Getting WriterT log lazily
Martijn van Steenbergen
martijn at van.steenbergen.nl
Mon May 4 03:48:16 EDT 2009
Magnus Therning wrote:
> Without the `seq` the call to sleep will simply be skipped (is there an
> easier way to force evaluation there?). Without `unsafePerformIO` all
> the sleeping is done up front, and all numbers are print at once at the
> end.
>
> The goal is of course to use code along the same shape to do something
> more useful, and then `unsafePerformIO` will really be unsafe...
So what you're trying to do is run two IO actions at the same time: one
to produce values, the other to consume values.
If you want to be really safe use threads (does that sound
paradoxical?), as Ertegrul suggested, although I'd use channels instead
of an MVar since this seems to be a perfect example for them.
Otherwise, you can use unsafeInterleaveIO: no unsafePerformIO or seq
needed, but there's still "unsafe" in that name there. This works for me:
> foo :: WriterT [Int] IO ()
> foo = let
> _tell i = do
> a <- lift $ unsafeInterleaveIO $ threadDelay 100000 >> return 0
> tell [i + a]
> in do
> mapM_ _tell [1..10]
Martijn.
More information about the Haskell-Cafe
mailing list