2 join, apply, (@@), mapAndUnzipL, mapAndUnzipR, accumulateL,
3 accumulateR, zipWithL, zipWithR, sequenceL, sequenceR,
4 mapL, mapR, map_, foldL, foldR, concatM, done, unless, when
7 join :: (Monad m) => m (m a) -> m a
10 apply :: (Monad m) => (a -> m b) -> (m a -> m b)
13 (@@) :: (Monad m) => (a -> m b) -> (c -> m a) -> (c -> m b)
14 f @@ g = \ x -> g x >>= f
16 mapAndUnzipL :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
17 mapAndUnzipL f xs = accumulateL (map f xs) >>= return . unzip
19 mapAndUnzipR :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
20 mapAndUnzipR f xs = accumulateR (map f xs) >>= return . unzip
22 accumulateL :: (Monad m) => [m a] -> m [a]
23 accumulateL = accumulate
25 accumulateR :: (Monad m) => [m a] -> m [a]
26 accumulateR = foldr mcons (return [])
27 where mcons p q = q >>= \ xs -> p >>= \ x -> return (x:xs)
29 zipWithL :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
30 zipWithL f xs ys = accumulateL (zipWith f xs ys)
32 zipWithR :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
33 zipWithR f xs ys = accumulateR (zipWith f xs ys)
35 sequenceL :: (Monad m) => [m a] -> m ()
36 sequenceL [] = return ()
37 sequenceL (x:xs) = x >> sequenceL xs
39 sequenceR :: (Monad m) => [m a] -> m ()
40 sequenceR [] = return ()
41 sequenceR (x:xs) = sequenceR xs >> x >> return ()
43 mapL :: (Monad m) => (a -> m b) -> ([a] -> m [b])
45 mapL f (x:xs) = f x >>= \ y -> mapL f xs >>= \ ys -> return (y:ys)
47 mapR :: (Monad m) => (a -> m b) -> ([a] -> m [b])
49 mapR f (x:xs) = mapR f xs >>= \ ys -> f x >>= \ y -> return (y:ys)
51 map_ :: (Monad m) => (a -> m b) -> ([a] -> m ())
53 map_ f (x:xs) = f x >> map_ f xs
55 foldL :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
56 foldL f a [] = return a
57 foldL f a (x:xs) = f a x >>= \fax -> foldL f fax xs
59 foldR :: (Monad m) => (a -> b -> m b) -> b -> [a] -> m b
60 foldR f a [] = return a
61 foldR f a (x:xs) = foldR f a xs >>= \y -> f x y
63 concatM :: MonadPlus m => [m a] -> m a
64 concatM = foldr (++) zero
66 done :: (Monad m) => m ()
69 unless :: (Monad m) => Bool -> m () -> m ()
70 unless p s = if p then return () else s
72 when :: (Monad m) => Bool -> m () -> m ()
73 when p s = if p then s else return ()