On 8/2/06, Kaveh Shahbazian <[EMAIL PROTECTED]> wrote:
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. Thankyou
You're doing IO so I guess the IO monad would be the way to go here. So something like this: import Data.IORef main = do var <- newIORef 0 fun1 var fun2 var writeIORef var 10 val <- readIORef var putStrLn ( "var " ++ show val) fun1 var = do writeIORef var 0 val <- readIORef var print val fun2 var = do modifyIORef var (+4) val <- readIORef var print val Notice that you have to pass the mutable reference around (no globals) and extract its value explicitly whenever you want to use it. You can also use mutable values using the ST monad rather than the IO monad. This allows you to "run" the resulting actions from within purely functional code, whereas there is no way to run an IO action (i.e. you can't convert an IO Int to an Int - once you're in IO you don't get out). /S -- Sebastian Sylvan +46(0)736-818655 UIN: 44640862 _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe