Add Kleisli composition to Control.Monad
Kleisli composition of monads is a foundational feature missing from the current Control.Monad library. A 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 ()
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 <dons@cse.unsw.edu.au>**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
+
Trac metadata
Trac field | Value |
---|---|
Version | 6.6 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | Unknown |
Architecture | Multiple |