\section[Monad]{Module @Monad@}
\begin{code}
-{-# OPTIONS -fno-implicit-prelude #-}
-
module Monad
( MonadPlus ( -- class context: Monad
mzero -- :: (MonadPlus m) => m a
, mplus -- :: (MonadPlus m) => m a -> m a -> m a
)
, join -- :: (Monad m) => m (m a) -> m a
- , guard -- :: (Monad m) => Bool -> m ()
+ , guard -- :: (MonadPlus m) => Bool -> m ()
, when -- :: (Monad m) => Bool -> m () -> m ()
, unless -- :: (Monad m) => Bool -> m () -> m ()
, ap -- :: (Monad m) => (m (a -> b)) -> (m a) -> m b
, (=<<) -- :: (Monad m) => (a -> m b) -> m a -> m b
) where
-import PrelList
-import PrelTup
-import PrelBase
-import PrelMaybe ( Maybe(..) )
-
-infixr 1 =<<
+import Prelude
\end{code}
%*********************************************************
%*********************************************************
\begin{code}
-sequence :: Monad m => [m a] -> m [a]
-sequence [] = return []
-sequence (m:ms) = do { x <- m; xs <- sequence ms; return (x:xs) }
-
-sequence_ :: Monad m => [m a] -> m ()
-sequence_ = foldr (>>) (return ())
-
-mapM :: Monad m => (a -> m b) -> [a] -> m [b]
-mapM f as = sequence (map f as)
-
-mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
-mapM_ f as = sequence_ (map f as)
-
guard :: MonadPlus m => Bool -> m ()
guard pred
| pred = return ()
-- This subsumes the list-based concat function.
msum :: MonadPlus m => [m a] -> m a
+{-# INLINE msum #-}
msum = foldr mplus mzero
-
-{-# SPECIALISE (=<<) :: (a -> [b]) -> [a] -> [b] #-}
-(=<<) :: Monad m => (a -> m b) -> m a -> m b
-f =<< x = x >>= f
\end{code}