
On Feb 3, 2006, at 11:28 AM, MaurĂcio wrote:
Kurt Hutchinson 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 }; An idiomatic approach: example :: Double -> Double -> IO () example a b | a == b = return () | otherwise = do let a' = a / 2 print a' b' <- readLn example a' b'
On 2/2/06, MaurĂcio
wrote: main = example 1000 0 Thanks! Robert's, Chris' and yours examples solved many of my questions. I understand I can insert modifications in IORefs (as used by Robert and Chris) inside the loop above:
| otherwise = do let a' = a / 2 ... modifyIORef some_ioref some_function ... example a' b'
I wonder if I could write a generic while based on your example:
while :: (a -> IO a) -> (a -> Bool) -> IO ()
I'll probably learn something trying that.
FYI, here's a thread from a few months back about monad control structures; it may also provide some enlightenment. http://www.haskell.org/pipermail/haskell-cafe/2005-October/011890.html Rob Dockins Speak softly and drive a Sherman tank. Laugh hard; it's a long way to the bank. -- TMBG