On Mon, Dec 13, 2010 at 7:15 AM, Jacek Generowicz
<jacek.generow...@cern.ch> wrote:
> -- 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

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to