Am Mittwoch, 2. August 2006 11:56 schrieb 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. > Thankyou
Well, I don't know C#, so maybe I misinterpreted Console.Write, but probably not, so: import Control.Monad.State fun1 :: StateT Int IO () fun1 = do put 0 var <- get lift $ print var fun2 :: StateT Int IO () fun2 = do modify (+4) var <- get lift $ print var mfun :: StateT Int IO () mfun = do fun1 fun2 put 10 var <- get lift $ putStrLn $ "var = " ++ show var main :: IO () main = evalStateT mfun 0 -- since the initial state isn't used, even undefined would do Another possibility would be (using State Int (IO ()) instead of StateT Int IO ()): import Control.Monad.State fun1 = put (0::Int) >> get >>= return . print fun2 = modify (+4) >> get >>= return . print fin = put 10 >> get >>= return . putStrLn . (++) "var = " . show mfun = sequence [fun1, fun2, fin] main = sequence_ $ evalState mfun 0 but I deem the first preferable. Also take a look at monad tutorials, e.g. Jeff Newbern's All About Monads (sorry, I forgot the URL). Cheers, Daniel -- "In My Egotistical Opinion, most people's C programs should be indented six feet downward and covered with dirt." -- Blair P. Houghton _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe