Copyright | KONISHI Yohuske 2015 |
---|---|
License | BSD-style (see the LICENSE file in the distribution) |
Maintainer | ocean0yohsuke@gmail.com |
Stability | experimental |
Portability | --- |
Safe Haskell | Safe |
Language | Haskell2010 |
This module enables you to program in Monad for more deeper level than the usual Monad
module expresses.
You would soon realize exactly what more deeper level means by reading the example codes in order, which are attached on the Monadx(Monad2, Monad3, etc) classes below.
Note:
- Though this module substitutes for monad-transform consisted of elemental(without-lambda-expression) kind of monad, however, this module is unable to substitute for monad-transform consisted of complicated(tangled-with-lambda-expression) kind of monad at all. So this module does not thoroughly make mlt(monad-transformer-library) unnessasary. The range in which this module is helpful is confined to the range that single Monad or Monad with Monadx series (namely Monad2, Monad3, etc) defines.
- In my opinion the above problem is hard-wired with the ability of the compiler, that is to say GHC doesn't parse
(r->)
or((->) r)
as a data constructor; thus some fundamental expressions such as(r->)|$>
orfmap (r->)
are useless. Theoretically it might be impossible though.
- module Control.Monad
- (-<) :: (a -> b) -> a -> b
- (>-) :: a -> (a -> b) -> b
- (>->) :: (a -> b) -> (b -> c) -> a -> c
- (<-<) :: (b -> c) -> (a -> b) -> a -> c
- (<<) :: Monad m => m b -> m a -> m b
- class Monad m2 => Monad2 m2 where
- (>>~) :: (Monad m1, Monad2 m2) => m1 (m2 a) -> m1 (m2 b) -> m1 (m2 b)
- (>-==) :: (Monad m1, Monad2 m2) => m1 a -> (a -> m1 (m2 b)) -> m1 (m2 b)
- (->==) :: (Monad m1, Monad2 m2) => m2 a -> (a -> m1 (m2 b)) -> m1 (m2 b)
- (>-~) :: (Monad m1, Monad2 m2) => m1 a -> m1 (m2 b) -> m1 (m2 b)
- (->~) :: (Monad m1, Monad2 m2) => m2 a -> m1 (m2 b) -> m1 (m2 b)
- (>==>) :: (Monad m1, Monad2 m2) => (a -> m1 (m2 b)) -> (b -> m1 (m2 c)) -> a -> m1 (m2 c)
- class Monad m3 => Monad3 m3 where
- (>>-==) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m2 a) -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b))
- (->>==) :: (Monad m1, Monad2 m2, Monad3 m3) => m2 (m3 a) -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b))
- (>->==) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m3 a) -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b))
- (>--==) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 a -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b))
- (->-==) :: (Monad m1, Monad2 m2, Monad3 m3) => m2 a -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b))
- (-->==) :: (Monad m1, Monad2 m2, Monad3 m3) => m3 a -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b))
- (>>>~) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m2 (m3 a)) -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b))
- (->-~) :: (Monad m1, Monad2 m2, Monad3 m3) => m2 a -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b))
- (-->~) :: (Monad m1, Monad2 m2, Monad3 m3) => m3 a -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b))
- (>>-~) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m2 a) -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b))
- (->>~) :: (Monad m1, Monad2 m2, Monad3 m3) => m2 (m3 a) -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b))
- (>->~) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m3 a) -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b))
- (>--~) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 a -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b))
- (>===>) :: (Monad m1, Monad2 m2, Monad3 m3) => (a -> m1 (m2 (m3 b))) -> (b -> m1 (m2 (m3 c))) -> a -> m1 (m2 (m3 c))
- class Monad m4 => Monad4 m4 where
- (>>>>~) :: (Monad m1, Monad2 m2, Monad3 m3, Monad4 m4) => m1 (m2 (m3 (m4 a))) -> m1 (m2 (m3 (m4 b))) -> m1 (m2 (m3 (m4 b)))
- (>====>) :: (Monad m1, Monad2 m2, Monad3 m3, Monad4 m4) => (a -> m1 (m2 (m3 (m4 b)))) -> (b -> m1 (m2 (m3 (m4 c)))) -> a -> m1 (m2 (m3 (m4 c)))
- class Monad m5 => Monad5 m5 where
- (>>>>>~) :: (Monad m1, Monad2 m2, Monad3 m3, Monad4 m4, Monad5 m5) => m1 (m2 (m3 (m4 (m5 a)))) -> m1 (m2 (m3 (m4 (m5 b)))) -> m1 (m2 (m3 (m4 (m5 b))))
- (>=====>) :: (Monad m1, Monad2 m2, Monad3 m3, Monad4 m4, Monad5 m5) => (a -> m1 (m2 (m3 (m4 (m5 b))))) -> (b -> m1 (m2 (m3 (m4 (m5 c))))) -> a -> m1 (m2 (m3 (m4 (m5 c))))
Documentation
module Control.Monad
Level-0
bind function
(>-) :: a -> (a -> b) -> b infixl 1 Source
The auguments-flipped function for
.-<
>>>
3 >- Just
Just 3
composite function
(>->) :: (a -> b) -> (b -> c) -> a -> c infixr 1 Source
The auguments-flipped function for
. <-<
>>>
1 >- ((+1) >-> (*2) >-> (+3))
7
(<-<) :: (b -> c) -> (a -> b) -> a -> c infixr 1 Source
Alias for
. .
>>>
((3+) <-< (2*) <-< (1+)) -< 1
7
Level-1
bind-sequence function
Level-2
class Monad m2 => Monad2 m2 where Source
The Monad2
class defines the Monad functions for level-2 types m1 (m2 a)
; such as [[a]], Maybe [a], Either () (Maybe a), a -> [b], IO [a], etc.
>>>
:{
[["a","b"]] >>== \x -> [[0],[1,2]] >>== \y -> (**:) $ x ++ show y :} [["a0","b0"],["a0","b1","b2"],["a1","a2","b0"],["a1","a2","b1","b2"]]
>>>
:{
let isJust (Just _) = True isJust _ = False pythagorean_triple :: [Maybe (Int, Int, Int)] -- List-Maybe Monad pythagorean_triple = filter isJust $ [1..10] >-== \x -> [1..10] >-== \y -> [1..10] >-== \z -> guard (x < y && x*x + y*y == z*z) ->~ (**:) (x,y,z) in pythagorean_triple :} [Just (3,4,5),Just (6,8,10)]
bind-sequence function
(>>~) :: (Monad m1, Monad2 m2) => m1 (m2 a) -> m1 (m2 b) -> m1 (m2 b) infixr 1 Source
Sequence function of level-2.
composite function
(>==>) :: (Monad m1, Monad2 m2) => (a -> m1 (m2 b)) -> (b -> m1 (m2 c)) -> a -> m1 (m2 c) infixr 1 Source
Composite function of level-2.
Level-3
class Monad m3 => Monad3 m3 where Source
The Monad3
class defines the Monad functions for level-3 types m1 (m2 (m3 a)
.
>>>
:{
let isJust (Just _) = True isJust _ = False pythagorean_triple :: IO [Maybe (Int, Int, Int)] -- IO-List-Maybe Monad pythagorean_triple = filter isJust |$> ( [1..10] ->-== \x -> [1..10] ->-== \y -> [1..10] ->-== \z -> guard (x < y && x*x + y*y == z*z) -->~ print (x,y,z) >--~ (***:) (x,y,z) ) in pythagorean_triple :} (3,4,5) (6,8,10) [Just (3,4,5),Just (6,8,10)]
bind-sequence function
(>>-==) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m2 a) -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b)) infixr 1 Source
(->>==) :: (Monad m1, Monad2 m2, Monad3 m3) => m2 (m3 a) -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b)) infixr 1 Source
(>->==) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m3 a) -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b)) infixr 1 Source
(>--==) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 a -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b)) infixr 1 Source
(->-==) :: (Monad m1, Monad2 m2, Monad3 m3) => m2 a -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b)) infixr 1 Source
(-->==) :: (Monad m1, Monad2 m2, Monad3 m3) => m3 a -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b)) infixr 1 Source
(>>>~) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m2 (m3 a)) -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b)) infixr 1 Source
(->-~) :: (Monad m1, Monad2 m2, Monad3 m3) => m2 a -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b)) infixr 1 Source
(-->~) :: (Monad m1, Monad2 m2, Monad3 m3) => m3 a -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b)) infixr 1 Source
(>>-~) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m2 a) -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b)) infixr 1 Source
(->>~) :: (Monad m1, Monad2 m2, Monad3 m3) => m2 (m3 a) -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b)) infixr 1 Source
(>->~) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m3 a) -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b)) infixr 1 Source
(>--~) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 a -> m1 (m2 (m3 b)) -> m1 (m2 (m3 b)) infixr 1 Source
composite function
(>===>) :: (Monad m1, Monad2 m2, Monad3 m3) => (a -> m1 (m2 (m3 b))) -> (b -> m1 (m2 (m3 c))) -> a -> m1 (m2 (m3 c)) infixr 1 Source
Level-4
bind-sequence function
(>>>>~) :: (Monad m1, Monad2 m2, Monad3 m3, Monad4 m4) => m1 (m2 (m3 (m4 a))) -> m1 (m2 (m3 (m4 b))) -> m1 (m2 (m3 (m4 b))) infixr 1 Source
composite function
(>====>) :: (Monad m1, Monad2 m2, Monad3 m3, Monad4 m4) => (a -> m1 (m2 (m3 (m4 b)))) -> (b -> m1 (m2 (m3 (m4 c)))) -> a -> m1 (m2 (m3 (m4 c))) infixr 1 Source
Level-5
bind-sequence function
(>>>>>~) :: (Monad m1, Monad2 m2, Monad3 m3, Monad4 m4, Monad5 m5) => m1 (m2 (m3 (m4 (m5 a)))) -> m1 (m2 (m3 (m4 (m5 b)))) -> m1 (m2 (m3 (m4 (m5 b)))) infixr 1 Source