mzero -- :: (MonadPlus m) => m a
, mplus -- :: (MonadPlus m) => m a -> m a -> m a
)
- , join -- :: (Monad m) => m (m a) -> m a
+ , join -- :: (Monad m) => m (m a) -> m a
, guard -- :: (Monad 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
+ , when -- :: (Monad m) => Bool -> m () -> m ()
+ , unless -- :: (Monad m) => Bool -> m () -> m ()
+ , ap -- :: (Monad m) => (m (a -> b)) -> (m a) -> m b
, msum -- :: (MonadPlus m) => [m a] -> m a
, filterM -- :: (Monad m) => (a -> m Bool) -> [m a] -> m [a]
- , mapAndUnzipM -- :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
- , zipWithM -- :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
+ , mapAndUnzipM -- :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
+ , zipWithM -- :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
, zipWithM_ -- :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m ()
- , foldM -- :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
+ , foldM -- :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
, liftM -- :: (Monad m) => (a -> b) -> (m a -> m b)
, liftM2 -- :: (Monad m) => (a -> b -> c) -> (m a -> m b -> m c)
, (=<<) -- :: (Monad m) => (a -> m b) -> m a -> m b
) where
+#ifndef __HUGS__
import PrelList
import PrelTup
import PrelBase
import PrelMaybe ( Maybe(..) )
+
+infixr 1 =<<
+#endif
\end{code}
%*********************************************************
%*********************************************************
\begin{code}
+#ifdef __HUGS__
+-- These functions are defined in the Prelude.
+-- sequence :: Monad m => [m a] -> m [a]
+-- sequence_ :: Monad m => [m a] -> m ()
+-- mapM :: Monad m => (a -> m b) -> [a] -> m [b]
+-- mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
+#else
sequence :: Monad m => [m a] -> m [a]
-sequence [] = return []
-sequence (m:ms) = do { x <- m; xs <- sequence ms; return (x:xs) }
+{-# INLINE sequence #-}
+sequence ms = foldr k (return []) ms
+ where
+ k m m' = do { x <- m; xs <- m'; return (x:xs) }
sequence_ :: Monad m => [m a] -> m ()
-sequence_ = foldr (>>) (return ())
+{-# INLINE sequence_ #-}
+sequence_ ms = foldr (>>) (return ()) ms
mapM :: Monad m => (a -> m b) -> [a] -> m [b]
+{-# INLINE mapM #-}
mapM f as = sequence (map f as)
mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
+{-# INLINE mapM_ #-}
mapM_ f as = sequence_ (map f as)
+#endif
guard :: MonadPlus m => Bool -> m ()
guard pred
-- This subsumes the list-based concat function.
msum :: MonadPlus m => [m a] -> m a
+{-# INLINE msum #-}
msum = foldr mplus mzero
+#ifdef __HUGS__
+-- This function is defined in the Prelude.
+--(=<<) :: Monad m => (a -> m b) -> m a -> m b
+#else
{-# SPECIALISE (=<<) :: (a -> [b]) -> [a] -> [b] #-}
(=<<) :: Monad m => (a -> m b) -> m a -> m b
f =<< x = x >>= f
+#endif
\end{code}