On 29 August 2012 10:21, Corentin Dupont <corentin.dupont@gmail.com> wrote:
f,g :: IO ()
f = withFile "toto" WriteMode (flip hPutStr "42")
g = withFile "toto" ReadMode hGetLine >>= (\s -> putStrLn $ "Answer:" ++ s)
main = f >> g


Is it possible to do the same without files (the types must remain IO())?

One can use an IORef to get a similar effect.

import Data.IORef
import System.IO.Unsafe

{-# NOINLINE toto #-}
toto :: IORef String
toto = unsafePerformIO (newIORef "")

f,g :: IO ()
f = writeIORef toto "42"
g = readIORef toto >>= (\s -> putStrLn $ "Answer:" ++ s)

main = f >> g

HTH,
Ozgur