[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / interpreter / library / Monad.hs
1 module Monad (
2     join, mapAndUnzipM, zipWithM, zipWithM_, foldM, when, unless, ap,
3     liftM, liftM2, liftM3, liftM4, liftM5
4     ) where
5
6 join             :: (Monad m) => m (m a) -> m a
7 join x           =  x >>= id
8
9 mapAndUnzipM     :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
10 mapAndUnzipM f xs = accumulate (map f xs) >>= return . unzip
11
12 zipWithM         :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
13 zipWithM f xs ys =  accumulate (zipWith f xs ys)
14
15 zipWithM_         :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m ()
16 zipWithM_ f xs ys =  sequence (zipWith f xs ys)
17
18 foldM            :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
19 foldM f a []     =  return a
20 foldM f a (x:xs) =  f a x >>= \ y -> foldM f y xs
21
22 when             :: (Monad m) => Bool -> m () -> m ()
23 when p s         =  if p then s else return ()
24
25 unless           :: (Monad m) => Bool -> m () -> m ()
26 unless p s       =  when (not p) s
27
28 ap               :: (Monad m) => m (a -> b) -> m a -> m b
29 ap               =  liftM2 ($)
30
31 #if STD_PRELUDE
32 liftM            :: (Monad m) => (a -> b) -> (m a -> m b)
33 liftM f          =  \a -> [f a' | a' <- a]
34
35 liftM2           :: (Monad m) => (a -> b -> c) -> (m a -> m b -> m c)
36 liftM2 f         =  \a b -> [f a' b' | a' <- a, b' <- b]  
37
38 liftM3           :: (Monad m) => (a -> b -> c -> d) ->
39                                  (m a -> m b -> m c -> m d)
40 liftM3 f         =  \a b c -> [f a' b' c' | a' <- a, b' <- b, c' <- c]  
41
42 liftM4           :: (Monad m) => (a -> b -> c -> d -> e) ->
43                                  (m a -> m b -> m c -> m d -> m e)
44 liftM4 f         =  \a b c d -> [f a' b' c' d' |
45                                  a' <- a, b' <- b, c' <- c, d' <- d]  
46
47 liftM5           :: (Monad m) => (a -> b -> c -> d -> e -> f) ->
48                                  (m a -> m b -> m c -> m d -> m e -> m f)
49 liftM5 f         =  \a b c d e -> [f a' b' c' d' e' |
50                                    a' <- a, b' <- b,
51                                    c' <- c, d' <- d, e' <- e]
52 #else
53 liftM            :: (Monad m) => (a -> b) -> (m a -> m b)
54 liftM f          =  \a -> do { a' <- a; return (f a') }
55
56 liftM2           :: (Monad m) => (a -> b -> c) -> (m a -> m b -> m c)
57 liftM2 f         =  \a b -> do { a' <- a; b' <- b; return (f a' b') }
58
59 liftM3           :: (Monad m) => (a -> b -> c -> d) ->
60                                  (m a -> m b -> m c -> m d)
61 liftM3 f         =  \a b c -> do { a' <- a; b' <- b; c' <- c
62                                  ; return (f a' b' c') 
63                                  }
64
65 liftM4           :: (Monad m) => (a -> b -> c -> d -> e) ->
66                                  (m a -> m b -> m c -> m d -> m e)
67 liftM4 f         =  \a b c d -> do { a' <- a; b' <- b; c' <- c; d' <- d
68                                    ; return (f a' b' c' d')
69                                    }
70                                 
71
72 liftM5           :: (Monad m) => (a -> b -> c -> d -> e -> f) ->
73                                  (m a -> m b -> m c -> m d -> m e -> m f)
74 liftM5 f         =  \a b c d e -> do { a' <- a; b' <- b
75                                      ; c' <- c; d' <- d; e' <- e
76                                      ; return (f a' b' c' d' e')
77                                      }
78                                   
79 #endif