[Haskell-beginners] IO vars

Corentin Dupont corentin.dupont at gmail.com
Wed Aug 29 12:00:50 CEST 2012


Thanks Eugene and Ozgur.
I also looked on the side of IORef, but it doesn't looked to be a good
solution since we have to use unsafePerformIO.

I have a big program to modify, and I want to pass some new data to
existing functions of type IO(). I'd like to avoid changing all the
function's types down the chain... What is the best way to do that?



On Wed, Aug 29, 2012 at 11:43 AM, Ozgur Akgun <ozgurakgun at gmail.com> wrote:

> On 29 August 2012 10:21, Corentin Dupont <corentin.dupont at 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20120829/00ede05b/attachment.htm>


More information about the Beginners mailing list