On Sun, 15 Mar 2009, Ryan Ingram wrote:

unsafeInterleaveIO allows embedding side effects into a pure
computation.  This means you can potentially observe if some pure
value has been evaluated or not;  the result of your code could change
depending how lazy/strict it is, which is very hard to predict!

For example:

-- given
f :: Integer -> Integer

main = do
    r <- newIORef 0
    v <- unsafeInterleaveIO $ do
        writeIORef r 1
        return 1
    x <- case f v of
        0 -> return 0
        n -> return (n - 1)
    y <- readIORef r
    print y

-- a couple of examples:
f x = 0 -- program prints "0"
-- f x = x -- program prints "1"

Interesting example. I have implemented the lazyio package. It asserts that unsafely interleaved IO actions are performed in order. This should prevent such problems, does it? However, they are only avoided within the LazyIO monad. Running the LazyIO monad in IO allows the same corruptions as shown above.

http://hackage.haskell.org/cgi-bin/hackage-scripts/package/lazyio
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to