<div class="gmail_quote">On 29 August 2012 10:21, Corentin Dupont <span dir="ltr"><<a href="mailto:corentin.dupont@gmail.com" target="_blank">corentin.dupont@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div id=":121"><i>f,g :: IO ()<br>f = withFile "toto" WriteMode (flip hPutStr "42")<br>
g = withFile "toto" ReadMode hGetLine >>= (\s -> putStrLn $ "Answer:" ++ s)<br>
main = f >> g</i><br><br>Is it possible to do the same without files (the types must remain IO())?</div></blockquote></div><br>One can use an IORef to get a similar effect.<div><br></div><div><div><font face="courier new, monospace">import Data.IORef</font></div>
<div><font face="courier new, monospace">import System.IO.Unsafe</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">{-# NOINLINE toto #-}</font></div><div><font face="courier new, monospace">toto :: IORef String</font></div>
<div><font face="courier new, monospace">toto = unsafePerformIO (newIORef "")</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">f,g :: IO ()</font></div>
<div><font face="courier new, monospace">f = writeIORef toto "42"</font></div><div><font face="courier new, monospace">g = readIORef toto >>= (\s -> putStrLn $ "Answer:" ++ s)</font></div><div>
<font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">main = f >> g</font></div><div><br></div><div>HTH,</div><div>Ozgur</div>
</div>