id summary reporter owner description type status priority milestone component version resolution keywords cc os architecture failure testcase blockedby blocking related differential wikipage
997 Add Kleisli composition to Control.Monad dons "Kleisli composition of monads is a foundational feature missing from the current Control.Monad library. A [http://thread.gmane.org/gmane.comp.lang.haskell.libraries/5412/focus=5412 recent discussion] revealed solid support for its inclusion.
This patch adds:
{{{
(>=>) :: (Monad m) => (a -> m b) -> (b -> m c) -> (a -> m c)
(<=<) :: (Monad m) => (b -> m c) -> (a -> m b) -> (a -> m c)
}}}
Along with the useful control combinator:
{{{
forever :: (Monad m) => m a -> m ()
}}}
[http://www.cse.unsw.edu.au/~dons/data/cc.prelude Traditionally], {{{>=>}}} has been written as {{{@@}}}, however to support the flipped version, new notation seems to be required. It should be notated that there is overlap with the Kleisli class in Control.Arrow (specifically {{{>>>}}}), however, short of a convenient unifying form for Arrow and Monad, a monad-specific {{{>>>}}} seems reasonable. To mirror {{{>>>}}} and {{{=<<}}}, infixr 1 was chosen.
Proposal period: 2 weeks. Deadline: 27th November.
The patch in its entirety:
{{{
New patches:
[Add Kleisli composition
Don Stewart **20061113015442] {
hunk ./Control/Monad.hs 40
+ , (>=>) -- :: (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 ()
hunk ./Control/Monad.hs 179
+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
+
hunk ./Control/Monad.hs 310
+
}}}" proposal closed normal libraries/base 6.6 fixed Unknown/Multiple Unknown/Multiple None/Unknown