[project @ 1999-12-20 10:12:50 by simonpj]
[ghc-hetmet.git] / ghc / lib / std / Monad.lhs
index d47921b..4c8c3ed 100644 (file)
@@ -11,17 +11,17 @@ module Monad
          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)
@@ -39,10 +39,14 @@ module Monad
     , (=<<)         -- :: (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}
 
 %*********************************************************
@@ -76,18 +80,31 @@ instance MonadPlus Maybe where
 %*********************************************************
 
 \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
@@ -106,11 +123,17 @@ filterM  predM (x:xs) = do
 -- 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}