2 join, mapAndUnzipM, zipWithM, zipWithM_, foldM, when, unless, ap,
3 liftM, liftM2, liftM3, liftM4, liftM5
6 join :: (Monad m) => m (m a) -> m a
9 mapAndUnzipM :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
10 mapAndUnzipM f xs = accumulate (map f xs) >>= return . unzip
12 zipWithM :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
13 zipWithM f xs ys = accumulate (zipWith f xs ys)
15 zipWithM_ :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m ()
16 zipWithM_ f xs ys = sequence (zipWith f xs ys)
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
22 when :: (Monad m) => Bool -> m () -> m ()
23 when p s = if p then s else return ()
25 unless :: (Monad m) => Bool -> m () -> m ()
26 unless p s = when (not p) s
28 ap :: (Monad m) => m (a -> b) -> m a -> m b
32 liftM :: (Monad m) => (a -> b) -> (m a -> m b)
33 liftM f = \a -> [f a' | a' <- a]
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]
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]
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]
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' |
51 c' <- c, d' <- d, e' <- e]
53 liftM :: (Monad m) => (a -> b) -> (m a -> m b)
54 liftM f = \a -> do { a' <- a; return (f a') }
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') }
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
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')
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')