david.maciver:
> On Wed, Nov 12, 2008 at 8:35 PM, Lennart Augustsson
> <[EMAIL PROTECTED]> wrote:
> > Actually, unsafeInterleaveIO is perfectly fine from a RT point of view.
> 
> Really? It seems easy to create things with it which when passed to
> ostensibly pure functions yield different results depending on their
> evaluation order:
> 
> module Main where
> 
> import System.IO.Unsafe
> import Data.IORef
> 
> main = do w1 <- weirdTuple
>           print w1
>           w2 <- weirdTuple
>           print $ swap w2
> 
> swap (x, y) = (y, x)
> 
> weirdTuple :: IO (Int, Int)
> weirdTuple = do it <- newIORef 1
>                 x <- unsafeInterleaveIO $ readIORef it
>                 y <- unsafeInterleaveIO $ do writeIORef it 2 >> return 1
>                 return (x, y)
> 
> [EMAIL PROTECTED]:~$ ./Unsafe
> (1,1)
> (1,2)
> 
> So show isn't acting in a referentially transparent way: If the second
> part of the tuple were evaluated before the first part it would give a
> different answer (as swapping demonstrates).

Mmmm? No. Where's the pure function that's now producing different
results?  I only see IO actions at play, which are operating on the
state of the world.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to