From 034f3df81ade3ecf6516869343db48aea0461077 Mon Sep 17 00:00:00 2001 From: Don Stewart Date: Mon, 13 Nov 2006 01:54:42 +0000 Subject: [PATCH] Add Kleisli composition --- Control/Monad.hs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Control/Monad.hs b/Control/Monad.hs index 32f0403..3080f5f 100644 --- a/Control/Monad.hs +++ b/Control/Monad.hs @@ -37,6 +37,9 @@ module Control.Monad , sequence -- :: (Monad m) => [m a] -> m [a] , sequence_ -- :: (Monad m) => [m a] -> m () , (=<<) -- :: (Monad m) => (a -> m b) -> m a -> m b + , (>=>) -- :: (Monad m) => (a -> m b) -> (b -> m c) -> (a -> m c) + , (<=<) -- :: (Monad m) => (b -> m c) -> (a -> m b) -> (a -> m c) + , forever -- :: (Monad m) => m a -> m () -- ** Generalisations of list functions @@ -173,6 +176,20 @@ msum :: MonadPlus m => [m a] -> m a {-# INLINE msum #-} msum = foldr mplus mzero +infixr 1 <=<, >=> + +-- | Left-to-right Kleisli composition of monads. +(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c) +f >=> g = \x -> f x >>= g + +-- | Right-to-left Kleisli composition of monads. '(>=>)', with the arguments flipped +(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c) +(<=<) = flip (>=>) + +-- | @'forever' act@ repeats the action infinitely. +forever :: (Monad m) => m a -> m () +forever a = a >> forever a + -- ----------------------------------------------------------------------------- -- Other monad functions @@ -290,6 +307,7 @@ is equivalent to ap :: (Monad m) => m (a -> b) -> m a -> m b ap = liftM2 id + {- $naming The functions in this library use the following naming conventions: -- 1.7.10.4