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.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to