[Haskell-cafe] Monad Imparative Usage Example

Donald Bruce Stewart dons at cse.unsw.edu.au
Wed Aug 2 06:17:30 EDT 2006


kaveh.shahbazian:
> Haskell is the most powerfull and interesting "thing" I'v ever
> encountered in IT world. But with an imparative background and lack of
> understanding (because of any thing include that maybe I am not that
> smart) has brought me problems. I know this is an old issue. But
> please help it.
> Question : Could anyone show me a sample of using a monad as a
> statefull variable?
> For example see this code in C# :
> //
> public class Test
> {
>    int var;
>    static void Fun1() { var = 0; Console.Write(var); }
>    static void Fun2() { var = var + 4; Console.Write(var); }
>    static void Main() { Fun1(); Fun2(); var = 10; Console.Write("var
> = " + var.ToString()); }
> }
> //
> I want to see this code in haskell.

Ok, here you go. A state monad on top of IO, storing just your variable. Its
even 'initialised' to undefined at the start :)

    import Control.Monad.State

    main = execStateT (do f1; f2; put 10) undefined
        
    f1 = do 
        let v = 0
        put v
        liftIO $ print v

    f2 = do
        v <- get
        let v' = v + 4
        put v'
        liftIO $ print v'

Running:
    $ runhaskell A.hs
    0
    4
    10

Of course, there are many other ways to do this, too.

-- Don


More information about the Haskell-Cafe mailing list