unsafeInterleaveIO ordering

David Sabel dsabel@stud.uni-frankfurt.de
Fri, 29 Aug 2003 23:49:03 +0200


Hi,

> if i say:
>
> foo = do
>  putStrLn "a"
>  unsafeInterleaveIO (putStrLn "b" >> putStrLn "c")
>  putStrLn "d"
>
> is it guarenteed that nothing will happen between putting "b" and "c"?
> that is, while the place/time at which the (putStrLn "b" >> putStrLn
> "c") is unspecified, is it the case that the whole thing will be done at
> once?

In your example it's more or less guaranteed that putting "b" and "c" will
never happen, because the result of the combinated IO action isn't demanded.

I think, a better example would be:

foo =
  do
   putStrLn "a"
   res <- unsafeInterleaveIO
              (getLine >>= \c -> getLine >>= \d -> return (c++d))
   putStrLn "d"
   putStrLn res

Here the result 'res' is demanded after printing "d", and the
IO action
 (getLine >>= \c -> getLine >>= \d -> return (c++d))
is performed after printing "d", when the result is demanded.

I don't know the answer to your main question, but if you
translate the combined monadic action down to core language
you'll get some nested case-expressions, and I don't think that
a correct program transformation could destroy the order of them
(which would be necessary to put another IO action between the others).



David Sabel
-----------
JWGU Frankfurt