- module Control.Monad
- class Sharing m where
- class Trans m a b where
- eval :: (Monad m, Trans m a b) => a -> m b
- data List m a
- nil :: Monad m => m (List m a)
- cons :: Monad m => m a -> m (List m a) -> m (List m a)
- isEmpty :: Monad m => m (List m a) -> m Bool
- first :: MonadPlus m => m (List m a) -> m a
- rest :: MonadPlus m => m (List m a) -> m (List m a)

# Documentation

module Control.Monad

# Classes

Interface of monads that support explicit sharing.

Interface to transform nested monadic data types. The provided
| function `trans`

is supposed to map the given function on every
| monadic argument. The result of `trans`

may be of the same type
| as the argument but can also be of a different type, e.g. to
| convert a value with nested monadic arguments to a corresponding
| value without.

Monad m => Trans m Double Double | |

Monad m => Trans m Float Float | |

Monad m => Trans m Char Char | |

Monad m => Trans m Int Int | |

Monad m => Trans m Bool Bool | |

(Monad m, Trans m a a) => Trans m [m a] [a] | An instance for lists with monadic elements that lifts all | monadic effects to the top level and yields a list with | non-monadic elements. |

(Monad m, Trans m a a) => Trans m [m a] [m a] | An instance for lists with monadic elements. |

(Monad m, Trans m a b) => Trans m (List m a) [b] | |

(Monad m, Trans m a b) => Trans m (List m a) (List m b) |

We provide instances of the `Trans`

class for some predefined
Haskell types. For flat types the function `trans`

just returns its
argument which has no arguments to which the given function could
be applied.

# Evaluation

eval :: (Monad m, Trans m a b) => a -> m bSource

Lifts all monadic effects in nested monadic values to the top
| level. If `m`

is a monad for non-determinism and the argument a
| data structure with nested non-determinism then the result
| corresponds to the normal form of the argument.

# Monadic lists

Data type for lists where both the head and tail are monadic.