
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