MaurĂcio wrote: > I understand those examples, but I really would like to know how to do > that with monads. I would like to ask the same question, but now with > this code: > > double a = 1000; > double b = 0; > while (a != b) { > a /= 2; > cout << a; // Prints a > cin << b; // User gives a number, stored in b > }; >
A close to line-for-line translation: import Data.IORef import Control.Monad(liftM2,when) main = example 1000 example :: Double -> IO () example originalA = do refA <- newIORef originalA -- allocate local variable a refB <- newIORef 0 -- allocate local variable b let loop = do -- loop in scope of refA, refB flag <- liftM2 (/=) (readIORef refA) (readIORef refB) when flag $ do modifyIORef refA (/2) print =<< readIORef refA -- This will give an error if not a number: writeIORef refB =<< readIO =<< getLine loop loop -- start executing loop _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe