-- From "On embedding a microarchitectural design language within Haskell", -- "Use and Abuse of unsafePerformIO" import Data.IORef import System.IO.Unsafe -- Resurrects the original ML-reference problem -- Also see the comments in GHC/IOBase.lhs cast :: a->b cast x = let r = unsafePerformIO (newIORef undefined) in unsafePerformIO (do {writeIORef r x; readIORef r}) -- cast' :: a -> a cast' x = unsafePerformIO (do r <- newIORef undefined writeIORef r x readIORef r)