mtl-2.3: Monad classes for transformers, using functional dependencies
Copyright(c) Andy Gill 2001
(c) Oregon Graduate Institute of Science and Technology 2001
LicenseBSD-style (see the file LICENSE)
Maintainerlibraries@haskell.org
Stabilityexperimental
Portabilitynon-portable (multi-param classes, functional dependencies)
Safe HaskellSafe
LanguageHaskell2010

Control.Monad.Writer.CPS

Description

Strict writer monads that use continuation-passing-style to achieve constant space usage.

Inspired by the paper Functional Programming with Overloading and Higher-Order Polymorphism, Mark P Jones (http://web.cecs.pdx.edu/~mpj/pubs/springschool.html) Advanced School of Functional Programming, 1995.

Since: mtl-2.3, transformers-0.5.6

Synopsis

MonadWriter class

class (Monoid w, Monad m) => MonadWriter w m | m -> w where Source #

Minimal complete definition

(writer | tell), listen, pass

Methods

writer :: (a, w) -> m a Source #

writer (a,w) embeds a simple writer action.

tell :: w -> m () Source #

tell w is an action that produces the output w.

listen :: m a -> m (a, w) Source #

listen m is an action that executes the action m and adds its output to the value of the computation.

pass :: m (a, w -> w) -> m a Source #

pass m is an action that executes the action m, which returns a value and a function, and returns the value, applying the function to the output.

Instances

Instances details
MonadWriter w m => MonadWriter w (MaybeT m) Source # 
Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> MaybeT m a Source #

tell :: w -> MaybeT m () Source #

listen :: MaybeT m a -> MaybeT m (a, w) Source #

pass :: MaybeT m (a, w -> w) -> MaybeT m a Source #

Monoid w => MonadWriter w ((,) w) Source #

Since: 2.2.2

Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> (w, a) Source #

tell :: w -> (w, ()) Source #

listen :: (w, a) -> (w, (a, w)) Source #

pass :: (w, (a, w -> w)) -> (w, a) Source #

(Monoid w, MonadWriter w m) => MonadWriter w (AccumT w m) Source #

There are two valid instances for AccumT. It could either:

  1. Lift the operations to the inner MonadWriter
  2. Handle the operations itself, à la a WriterT.

This instance chooses (1), reflecting that the intent of AccumT as a type is different than that of WriterT.

Since: 2.3

Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> AccumT w m a Source #

tell :: w -> AccumT w m () Source #

listen :: AccumT w m a -> AccumT w m (a, w) Source #

pass :: AccumT w m (a, w -> w) -> AccumT w m a Source #

MonadWriter w m => MonadWriter w (StateT s m) Source # 
Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> StateT s m a Source #

tell :: w -> StateT s m () Source #

listen :: StateT s m a -> StateT s m (a, w) Source #

pass :: StateT s m (a, w -> w) -> StateT s m a Source #

MonadWriter w m => MonadWriter w (StateT s m) Source # 
Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> StateT s m a Source #

tell :: w -> StateT s m () Source #

listen :: StateT s m a -> StateT s m (a, w) Source #

pass :: StateT s m (a, w -> w) -> StateT s m a Source #

MonadWriter w m => MonadWriter w (ReaderT r m) Source # 
Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> ReaderT r m a Source #

tell :: w -> ReaderT r m () Source #

listen :: ReaderT r m a -> ReaderT r m (a, w) Source #

pass :: ReaderT r m (a, w -> w) -> ReaderT r m a Source #

MonadWriter w m => MonadWriter w (IdentityT m) Source # 
Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> IdentityT m a Source #

tell :: w -> IdentityT m () Source #

listen :: IdentityT m a -> IdentityT m (a, w) Source #

pass :: IdentityT m (a, w -> w) -> IdentityT m a Source #

MonadWriter w m => MonadWriter w (ExceptT e m) Source #

Since: 2.2

Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> ExceptT e m a Source #

tell :: w -> ExceptT e m () Source #

listen :: ExceptT e m a -> ExceptT e m (a, w) Source #

pass :: ExceptT e m (a, w -> w) -> ExceptT e m a Source #

(Monoid w, Monad m) => MonadWriter w (WriterT w m) Source # 
Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> WriterT w m a Source #

tell :: w -> WriterT w m () Source #

listen :: WriterT w m a -> WriterT w m (a, w) Source #

pass :: WriterT w m (a, w -> w) -> WriterT w m a Source #

(Monoid w, Monad m) => MonadWriter w (WriterT w m) Source # 
Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> WriterT w m a Source #

tell :: w -> WriterT w m () Source #

listen :: WriterT w m a -> WriterT w m (a, w) Source #

pass :: WriterT w m (a, w -> w) -> WriterT w m a Source #

(Monoid w, Monad m) => MonadWriter w (WriterT w m) Source #

Since: 2.3

Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> WriterT w m a Source #

tell :: w -> WriterT w m () Source #

listen :: WriterT w m a -> WriterT w m (a, w) Source #

pass :: WriterT w m (a, w -> w) -> WriterT w m a Source #

(Monoid w, Monad m) => MonadWriter w (RWST r w s m) Source # 
Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> RWST r w s m a Source #

tell :: w -> RWST r w s m () Source #

listen :: RWST r w s m a -> RWST r w s m (a, w) Source #

pass :: RWST r w s m (a, w -> w) -> RWST r w s m a Source #

(Monoid w, Monad m) => MonadWriter w (RWST r w s m) Source # 
Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> RWST r w s m a Source #

tell :: w -> RWST r w s m () Source #

listen :: RWST r w s m a -> RWST r w s m (a, w) Source #

pass :: RWST r w s m (a, w -> w) -> RWST r w s m a Source #

(Monoid w, Monad m) => MonadWriter w (RWST r w s m) Source #

Since: 2.3

Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> RWST r w s m a Source #

tell :: w -> RWST r w s m () Source #

listen :: RWST r w s m a -> RWST r w s m (a, w) Source #

pass :: RWST r w s m (a, w -> w) -> RWST r w s m a Source #

listens :: MonadWriter w m => (w -> b) -> m a -> m (a, b) Source #

listens f m is an action that executes the action m and adds the result of applying f to the output to the value of the computation.

censor :: MonadWriter w m => (w -> w) -> m a -> m a Source #

censor f m is an action that executes the action m and applies the function f to its output, leaving the return value unchanged.

The Writer monad

type Writer w = WriterT w Identity #

A writer monad parameterized by the type w of output to accumulate.

The return function produces the output mempty, while >>= combines the outputs of the subcomputations using mappend.

runWriter :: Monoid w => Writer w a -> (a, w) #

Unwrap a writer computation as a (result, output) pair. (The inverse of writer.)

execWriter :: Monoid w => Writer w a -> w #

Extract the output from a writer computation.

mapWriter :: (Monoid w, Monoid w') => ((a, w) -> (b, w')) -> Writer w a -> Writer w' b #

Map both the return value and output of a computation using the given function.

The WriterT monad transformer

data WriterT w (m :: Type -> Type) a #

A writer monad parameterized by:

  • w - the output to accumulate.
  • m - The inner monad.

The return function produces the output mempty, while >>= combines the outputs of the subcomputations using mappend.

Instances

Instances details
MonadAccum w' m => MonadAccum w' (WriterT w m) Source #

Since: 2.3

Instance details

Defined in Control.Monad.Accum

Methods

look :: WriterT w m w' Source #

add :: w' -> WriterT w m () Source #

accum :: (w' -> (a, w')) -> WriterT w m a Source #

(Monoid w, MonadError e m) => MonadError e (WriterT w m) Source #

Since: 2.3

Instance details

Defined in Control.Monad.Error.Class

Methods

throwError :: e -> WriterT w m a Source #

catchError :: WriterT w m a -> (e -> WriterT w m a) -> WriterT w m a Source #

(Monoid w, MonadReader r m) => MonadReader r (WriterT w m) Source #

Since: 2.3

Instance details

Defined in Control.Monad.Reader.Class

Methods

ask :: WriterT w m r Source #

local :: (r -> r) -> WriterT w m a -> WriterT w m a Source #

reader :: (r -> a) -> WriterT w m a Source #

MonadSelect w' m => MonadSelect w' (WriterT w m) Source #

'Readerizes' the writer: the 'ranking' function can see the value that's been accumulated (of type w), but can't add anything to the log. Effectively, can be thought of as 'extending' the 'ranking' by all values of w, but which w gets given to any rank calls is predetermined by the 'outer writer' (and cannot change).

Since: 2.3

Instance details

Defined in Control.Monad.Select

Methods

select :: ((a -> w') -> a) -> WriterT w m a Source #

(Monoid w, MonadState s m) => MonadState s (WriterT w m) Source #

Since: 2.3

Instance details

Defined in Control.Monad.State.Class

Methods

get :: WriterT w m s Source #

put :: s -> WriterT w m () Source #

state :: (s -> (a, s)) -> WriterT w m a Source #

(Monoid w, Monad m) => MonadWriter w (WriterT w m) Source #

Since: 2.3

Instance details

Defined in Control.Monad.Writer.Class

Methods

writer :: (a, w) -> WriterT w m a Source #

tell :: w -> WriterT w m () Source #

listen :: WriterT w m a -> WriterT w m (a, w) Source #

pass :: WriterT w m (a, w -> w) -> WriterT w m a Source #

MonadTrans (WriterT w) 
Instance details

Defined in Control.Monad.Trans.Writer.CPS

Methods

lift :: Monad m => m a -> WriterT w m a #

Monad m => Monad (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.CPS

Methods

(>>=) :: WriterT w m a -> (a -> WriterT w m b) -> WriterT w m b #

(>>) :: WriterT w m a -> WriterT w m b -> WriterT w m b #

return :: a -> WriterT w m a #

Functor m => Functor (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.CPS

Methods

fmap :: (a -> b) -> WriterT w m a -> WriterT w m b #

(<$) :: a -> WriterT w m b -> WriterT w m a #

MonadFix m => MonadFix (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.CPS

Methods

mfix :: (a -> WriterT w m a) -> WriterT w m a #

MonadFail m => MonadFail (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.CPS

Methods

fail :: String -> WriterT w m a #

(Functor m, Monad m) => Applicative (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.CPS

Methods

pure :: a -> WriterT w m a #

(<*>) :: WriterT w m (a -> b) -> WriterT w m a -> WriterT w m b #

liftA2 :: (a -> b -> c) -> WriterT w m a -> WriterT w m b -> WriterT w m c #

(*>) :: WriterT w m a -> WriterT w m b -> WriterT w m b #

(<*) :: WriterT w m a -> WriterT w m b -> WriterT w m a #

MonadIO m => MonadIO (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.CPS

Methods

liftIO :: IO a -> WriterT w m a #

(Functor m, MonadPlus m) => Alternative (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.CPS

Methods

empty :: WriterT w m a #

(<|>) :: WriterT w m a -> WriterT w m a -> WriterT w m a #

some :: WriterT w m a -> WriterT w m [a] #

many :: WriterT w m a -> WriterT w m [a] #

(Functor m, MonadPlus m) => MonadPlus (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.CPS

Methods

mzero :: WriterT w m a #

mplus :: WriterT w m a -> WriterT w m a -> WriterT w m a #

(Monoid w, MonadCont m) => MonadCont (WriterT w m) Source #

Since: 2.3

Instance details

Defined in Control.Monad.Cont.Class

Methods

callCC :: ((a -> WriterT w m b) -> WriterT w m a) -> WriterT w m a Source #

execWriterT :: (Monad m, Monoid w) => WriterT w m a -> m w #

Extract the output from a writer computation.

mapWriterT :: (Monad n, Monoid w, Monoid w') => (m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b #

Map both the return value and output of a computation using the given function.