
On Mon, Dec 13, 2010 at 7:15 AM, Jacek Generowicz
-- Is it possible to rewrite code written in this style
untilQuit = do text <- getLine report text if text == "quit" then return () else untilQuit
-- in a style using higher order functions for abstract iteration? For -- example, something along these lines:
untilQuit' = (fmap (takeWhile (/= "quit"))) (sequence $ map (>>= report) (repeat getLine))
You are asking about standard library functions? Probably, but I think it is cleanest to just write a HOF to encapsulate this pattern. I have used this one before: whileM_ :: (Monad m) => (a -> Bool) -> m a -> m () whileM_ p m = bool (return ()) (whileM p m) . p =<< m bool :: a -> a -> Bool -> a bool t f True = t bool t f False = f untilQuit = whileM_ (/= "quit") (getLine >>= liftM2 (>>) report return) I find a variant of whileM that returns m [a] particularly handy for collecting events in an event loop. Luke