deepcontrol-0.1.0.0: Enable deeper level style of programming than the usual control provides

CopyrightKONISHI Yohuske 2015
LicenseBSD-style (see the LICENSE file in the distribution)
Maintainerocean0yohsuke@gmail.com
Stabilityexperimental
Portability---
Safe HaskellSafe
LanguageHaskell2010

DeepControl.Monad

Contents

Description

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->)|$> or fmap (r->) are useless. Theoretically it might be impossible though.

Synopsis

Documentation

Level-0

bind function

(-<) :: (a -> b) -> a -> b infixl 1 Source

Alias for $.

>>> Just -< 3
Just 3

(>-) :: 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

(<<) :: Monad m => m b -> m a -> m b infixr 1 Source

The auguments-flipped function for >>.

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)]

Methods

(>>==) :: Monad m1 => m1 (m2 a) -> (a -> m1 (m2 b)) -> m1 (m2 b) infixr 1 Source

Bind function of level-2.

bind-sequence function

(>>~) :: (Monad m1, Monad2 m2) => m1 (m2 a) -> m1 (m2 b) -> m1 (m2 b) infixr 1 Source

Sequence function of level-2.

(>-==) :: (Monad m1, Monad2 m2) => m1 a -> (a -> m1 (m2 b)) -> m1 (m2 b) infixr 1 Source

Bind-cover function made of bind >>== and cover -*, defined as m >-== k = (-*) m >>== k.

(->==) :: (Monad m1, Monad2 m2) => m2 a -> (a -> m1 (m2 b)) -> m1 (m2 b) infixr 1 Source

Bind-cover function made of bind >>== and cover *-, defined as m >-== k = (*-) m >>== k.

(>-~) :: (Monad m1, Monad2 m2) => m1 a -> m1 (m2 b) -> m1 (m2 b) infixr 1 Source

Sequence-cover function made of sequence >>~ and cover -*, defined as m >-~ k = (-*) m >>~ k.

(->~) :: (Monad m1, Monad2 m2) => m2 a -> m1 (m2 b) -> m1 (m2 b) infixr 1 Source

Sequence-cover function made of sequence >>~ and cover *-, defined as m >-~ k = (*-) m >>~ k.

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)]

Methods

(>>>==) :: (Monad m1, Monad2 m2) => m1 (m2 (m3 a)) -> (a -> m1 (m2 (m3 b))) -> m1 (m2 (m3 b)) infixr 1 Source

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

class Monad m4 => Monad4 m4 where Source

Methods

(>>>>==) :: (Monad m1, Monad2 m2, Monad3 m3) => m1 (m2 (m3 (m4 a))) -> (a -> m1 (m2 (m3 (m4 b)))) -> m1 (m2 (m3 (m4 b))) infixr 1 Source

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

class Monad m5 => Monad5 m5 where Source

Methods

(>>>>>==) :: (Monad m1, Monad2 m2, Monad3 m3, Monad4 m4) => m1 (m2 (m3 (m4 (m5 a)))) -> (a -> m1 (m2 (m3 (m4 (m5 b))))) -> m1 (m2 (m3 (m4 (m5 b)))) infixr 1 Source

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

composite function

(>=====>) :: (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)))) infixr 1 Source