ifM :: Monad m => m Bool -> m a -> m a -> m a ifM act t e = do b <- act if b then t else e anAction = return False otherAction = return True infixl 4 () :: Monad m => m Bool -> m a -> m a -> m a () = ifM main :: IO String main = anAction do putStrLn "branch a" return "a" $ otherAction do putStrLn "branch b" return "b" $ return "none"