2 % (c) The AQUA Project, Glasgow University, 1994-1999
4 \section[Monad]{Module @Monad@}
7 {-# OPTIONS -fno-implicit-prelude #-}
10 ( MonadPlus ( -- class context: Monad
11 mzero -- :: (MonadPlus m) => m a
12 , mplus -- :: (MonadPlus m) => m a -> m a -> m a
14 , join -- :: (Monad m) => m (m a) -> m a
15 , guard -- :: (Monad m) => Bool -> m ()
16 , when -- :: (Monad m) => Bool -> m () -> m ()
17 , unless -- :: (Monad m) => Bool -> m () -> m ()
18 , ap -- :: (Monad m) => (m (a -> b)) -> (m a) -> m b
19 , msum -- :: (MonadPlus m) => [m a] -> m a
20 , filterM -- :: (Monad m) => (a -> m Bool) -> [m a] -> m [a]
21 , mapAndUnzipM -- :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
22 , zipWithM -- :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
23 , zipWithM_ -- :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m ()
24 , foldM -- :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
26 , liftM -- :: (Monad m) => (a -> b) -> (m a -> m b)
27 , liftM2 -- :: (Monad m) => (a -> b -> c) -> (m a -> m b -> m c)
32 , Monad((>>=), (>>), return, fail)
35 , mapM -- :: (Monad m) => (a -> m b) -> [a] -> m [b]
36 , mapM_ -- :: (Monad m) => (a -> m b) -> [a] -> m ()
37 , sequence -- :: (Monad m) => [m a] -> m [a]
38 , sequence_ -- :: (Monad m) => [m a] -> m ()
39 , (=<<) -- :: (Monad m) => (a -> m b) -> m a -> m b
46 import PrelMaybe ( Maybe(..) )
52 %*********************************************************
54 \subsection{Monadic classes: @MonadPlus@}
56 %*********************************************************
60 class Monad m => MonadPlus m where
62 mplus :: m a -> m a -> m a
64 instance MonadPlus [] where
68 instance MonadPlus Maybe where
71 Nothing `mplus` ys = ys
76 %*********************************************************
78 \subsection{Functions mandated by the Prelude}
80 %*********************************************************
84 -- These functions are defined in the Prelude.
85 -- sequence :: Monad m => [m a] -> m [a]
86 -- sequence_ :: Monad m => [m a] -> m ()
87 -- mapM :: Monad m => (a -> m b) -> [a] -> m [b]
88 -- mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
90 sequence :: Monad m => [m a] -> m [a]
91 {-# INLINE sequence #-}
92 sequence ms = foldr k (return []) ms
94 k m m' = do { x <- m; xs <- m'; return (x:xs) }
96 sequence_ :: Monad m => [m a] -> m ()
97 {-# INLINE sequence_ #-}
98 sequence_ ms = foldr (>>) (return ()) ms
100 mapM :: Monad m => (a -> m b) -> [a] -> m [b]
102 mapM f as = sequence (map f as)
104 mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
106 mapM_ f as = sequence_ (map f as)
109 guard :: MonadPlus m => Bool -> m ()
114 -- This subsumes the list-based filter function.
116 filterM :: (Monad m) => ( a -> m Bool ) -> [a] -> m [a]
117 filterM _predM [] = return []
118 filterM predM (x:xs) = do
120 ys <- filterM predM xs
121 return (if flg then x:ys else ys)
123 -- This subsumes the list-based concat function.
125 msum :: MonadPlus m => [m a] -> m a
127 msum = foldr mplus mzero
130 -- This function is defined in the Prelude.
131 --(=<<) :: Monad m => (a -> m b) -> m a -> m b
133 {-# SPECIALISE (=<<) :: (a -> [b]) -> [a] -> [b] #-}
134 (=<<) :: Monad m => (a -> m b) -> m a -> m b
140 %*********************************************************
142 \subsection{Other monad functions}
144 %*********************************************************
147 join :: (Monad m) => m (m a) -> m a
150 mapAndUnzipM :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
151 mapAndUnzipM f xs = sequence (map f xs) >>= return . unzip
153 zipWithM :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
154 zipWithM f xs ys = sequence (zipWith f xs ys)
156 zipWithM_ :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m ()
157 zipWithM_ f xs ys = sequence_ (zipWith f xs ys)
159 foldM :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
160 foldM _ a [] = return a
161 foldM f a (x:xs) = f a x >>= \fax -> foldM f fax xs
163 unless :: (Monad m) => Bool -> m () -> m ()
164 unless p s = if p then return () else s
166 when :: (Monad m) => Bool -> m () -> m ()
167 when p s = if p then s else return ()
169 ap :: (Monad m) => m (a->b) -> m a -> m b
172 liftM :: (Monad m) => (a1 -> r) -> m a1 -> m r
173 liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
174 liftM3 :: (Monad m) => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
175 liftM4 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
176 liftM5 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r
178 liftM f m1 = do { x1 <- m1; return (f x1) }
179 liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }
180 liftM3 f m1 m2 m3 = do { x1 <- m1; x2 <- m2; x3 <- m3; return (f x1 x2 x3) }
181 liftM4 f m1 m2 m3 m4 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; return (f x1 x2 x3 x4) }
182 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) }