1 % -----------------------------------------------------------------------------
2 % $Id: Monad.lhs,v 1.13 2001/05/18 16:54:05 simonmar Exp $
4 % (c) The University of Glasgow, 1994-2000
7 \section[Monad]{Module @Monad@}
10 {-# OPTIONS -fno-implicit-prelude #-}
13 ( MonadPlus ( -- class context: Monad
14 mzero -- :: (MonadPlus m) => m a
15 , mplus -- :: (MonadPlus m) => m a -> m a -> m a
17 , join -- :: (Monad m) => m (m a) -> m a
18 , guard -- :: (MonadPlus m) => Bool -> m ()
19 , when -- :: (Monad m) => Bool -> m () -> m ()
20 , unless -- :: (Monad m) => Bool -> m () -> m ()
21 , ap -- :: (Monad m) => m (a -> b) -> m a -> m b
22 , msum -- :: (MonadPlus m) => [m a] -> m a
23 , filterM -- :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
24 , mapAndUnzipM -- :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
25 , zipWithM -- :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
26 , zipWithM_ -- :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m ()
27 , foldM -- :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
29 , liftM -- :: (Monad m) => (a -> b) -> (m a -> m b)
30 , liftM2 -- :: (Monad m) => (a -> b -> c) -> (m a -> m b -> m c)
35 , Monad((>>=), (>>), return, fail)
38 , mapM -- :: (Monad m) => (a -> m b) -> [a] -> m [b]
39 , mapM_ -- :: (Monad m) => (a -> m b) -> [a] -> m ()
40 , sequence -- :: (Monad m) => [m a] -> m [a]
41 , sequence_ -- :: (Monad m) => [m a] -> m ()
42 , (=<<) -- :: (Monad m) => (a -> m b) -> m a -> m b
52 %*********************************************************
54 \subsection{Prelude monad functions}
56 %*********************************************************
59 {-# SPECIALISE (=<<) :: (a -> [b]) -> [a] -> [b] #-}
60 (=<<) :: Monad m => (a -> m b) -> m a -> m b
63 sequence :: Monad m => [m a] -> m [a]
64 {-# INLINE sequence #-}
65 sequence ms = foldr k (return []) ms
67 k m m' = do { x <- m; xs <- m'; return (x:xs) }
69 sequence_ :: Monad m => [m a] -> m ()
70 {-# INLINE sequence_ #-}
71 sequence_ ms = foldr (>>) (return ()) ms
73 mapM :: Monad m => (a -> m b) -> [a] -> m [b]
75 mapM f as = sequence (map f as)
77 mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
79 mapM_ f as = sequence_ (map f as)
82 %*********************************************************
84 \subsection{Monadic classes: @MonadPlus@}
86 %*********************************************************
90 class Monad m => MonadPlus m where
92 mplus :: m a -> m a -> m a
94 instance MonadPlus [] where
98 instance MonadPlus Maybe where
101 Nothing `mplus` ys = ys
106 %*********************************************************
108 \subsection{Functions mandated by the Prelude}
110 %*********************************************************
113 guard :: (MonadPlus m) => Bool -> m ()
114 guard True = return ()
117 -- This subsumes the list-based filter function.
119 filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
120 filterM _ [] = return []
121 filterM p (x:xs) = do
124 return (if flg then x:ys else ys)
126 -- This subsumes the list-based concat function.
128 msum :: MonadPlus m => [m a] -> m a
130 msum = foldr mplus mzero
134 %*********************************************************
136 \subsection{Other monad functions}
138 %*********************************************************
141 join :: (Monad m) => m (m a) -> m a
144 mapAndUnzipM :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
145 mapAndUnzipM f xs = sequence (map f xs) >>= return . unzip
147 zipWithM :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
148 zipWithM f xs ys = sequence (zipWith f xs ys)
150 zipWithM_ :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m ()
151 zipWithM_ f xs ys = sequence_ (zipWith f xs ys)
153 foldM :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
154 foldM _ a [] = return a
155 foldM f a (x:xs) = f a x >>= \fax -> foldM f fax xs
157 unless :: (Monad m) => Bool -> m () -> m ()
158 unless p s = if p then return () else s
160 when :: (Monad m) => Bool -> m () -> m ()
161 when p s = if p then s else return ()
163 ap :: (Monad m) => m (a -> b) -> m a -> m b
166 liftM :: (Monad m) => (a1 -> r) -> m a1 -> m r
167 liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
168 liftM3 :: (Monad m) => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
169 liftM4 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
170 liftM5 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r
172 liftM f m1 = do { x1 <- m1; return (f x1) }
173 liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }
174 liftM3 f m1 m2 m3 = do { x1 <- m1; x2 <- m2; x3 <- m3; return (f x1 x2 x3) }
175 liftM4 f m1 m2 m3 m4 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; return (f x1 x2 x3 x4) }
176 liftM5 f m1 m2 m3 m4 m5 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; return (f x1 x2 x3 x4 x5) }