Copyright |
(c) Daniel Mendler 2016
(c) Andy Gill 2001 (c) Oregon Graduate Institute of Science and Technology 2001 |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | R.Paterson@city.ac.uk |
Stability | experimental |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell98 |
The strict
WriterT
monad transformer, which adds collection of
outputs (such as a count or string output) to a given monad.
This monad transformer provides only limited access to the output during the computation. For more general access, use Control.Monad.Trans.State instead.
This version builds its output strictly and uses continuation-passing-style to achieve constant space usage. This transformer can be used as a drop-in replacement for Control.Monad.Trans.Writer.Strict .
Synopsis
- type Writer w = WriterT w Identity
- writer :: ( Monoid w, Monad m) => (a, w) -> WriterT w m a
- runWriter :: Monoid w => Writer w a -> (a, w)
- execWriter :: Monoid w => Writer w a -> w
- mapWriter :: ( Monoid w, Monoid w') => ((a, w) -> (b, w')) -> Writer w a -> Writer w' b
- data WriterT w m a
- writerT :: ( Functor m, Monoid w) => m (a, w) -> WriterT w m a
- runWriterT :: Monoid w => WriterT w m a -> m (a, w)
- execWriterT :: ( Monad m, Monoid w) => WriterT w m a -> m w
- mapWriterT :: ( Monad n, Monoid w, Monoid w') => (m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
- tell :: ( Monoid w, Monad m) => w -> WriterT w m ()
- listen :: ( Monoid w, Monad m) => WriterT w m a -> WriterT w m (a, w)
- listens :: ( Monoid w, Monad m) => (w -> b) -> WriterT w m a -> WriterT w m (a, b)
- pass :: ( Monoid w, Monoid w', Monad m) => WriterT w m (a, w -> w') -> WriterT w' m a
- censor :: ( Monoid w, Monad m) => (w -> w) -> WriterT w m a -> WriterT w m a
- liftCallCC :: CallCC m (a, w) (b, w) -> CallCC ( WriterT w m) a b
- liftCatch :: Catch e m (a, w) -> Catch e ( WriterT w m) a
The Writer monad
writer :: ( Monoid w, Monad m) => (a, w) -> WriterT w m a Source #
Construct a writer computation from a (result, output) pair.
(The inverse of
runWriter
.)
runWriter :: Monoid w => Writer w a -> (a, w) Source #
Unwrap a writer computation as a (result, output) pair.
(The inverse of
writer
.)
execWriter :: Monoid w => Writer w a -> w Source #
Extract the output from a writer computation.
-
execWriter
m =snd
(runWriter
m)
The WriterT monad transformer
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
MonadTrans ( WriterT w) Source # | |
Monad m => Monad ( WriterT w m) Source # | |
Functor m => Functor ( WriterT w m) Source # | |
MonadFix m => MonadFix ( WriterT w m) Source # | |
MonadFail m => MonadFail ( WriterT w m) Source # | |
( Functor m, Monad m) => Applicative ( WriterT w m) Source # | |
Defined in Control.Monad.Trans.Writer.CPS pure :: a -> WriterT w m a Source # (<*>) :: WriterT w m (a -> b) -> WriterT w m a -> WriterT w m b Source # liftA2 :: (a -> b -> c) -> WriterT w m a -> WriterT w m b -> WriterT w m c Source # (*>) :: WriterT w m a -> WriterT w m b -> WriterT w m b Source # (<*) :: WriterT w m a -> WriterT w m b -> WriterT w m a Source # |
|
MonadIO m => MonadIO ( WriterT w m) Source # | |
( Functor m, MonadPlus m) => Alternative ( WriterT w m) Source # | |
( Functor m, MonadPlus m) => MonadPlus ( WriterT w m) Source # | |
writerT :: ( Functor m, Monoid w) => m (a, w) -> WriterT w m a Source #
Construct a writer computation from a (result, output) computation.
(The inverse of
runWriterT
.)
runWriterT :: Monoid w => WriterT w m a -> m (a, w) Source #
Unwrap a writer computation.
(The inverse of
writerT
.)
execWriterT :: ( Monad m, Monoid w) => WriterT w m a -> m w Source #
Extract the output from a writer computation.
-
execWriterT
m =liftM
snd
(runWriterT
m)
mapWriterT :: ( Monad n, Monoid w, Monoid w') => (m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b Source #
Map both the return value and output of a computation using the given function.
-
runWriterT
(mapWriterT
f m) = f (runWriterT
m)
Writer operations
tell :: ( Monoid w, Monad m) => w -> WriterT w m () Source #
is an action that produces the output
tell
w
w
.
listen :: ( Monoid w, Monad m) => WriterT w m a -> WriterT w m (a, w) Source #
is an action that executes the action
listen
m
m
and adds its
output to the value of the computation.
-
runWriterT
(listen
m) =liftM
(\ (a, w) -> ((a, w), w)) (runWriterT
m)
listens :: ( Monoid w, Monad m) => (w -> b) -> WriterT w m a -> WriterT w m (a, b) Source #
is an action that executes the action
listens
f m
m
and adds
the result of applying
f
to the output to the value of the computation.
-
listens
f m =liftM
(id *** f) (listen
m) -
runWriterT
(listens
f m) =liftM
(\ (a, w) -> ((a, f w), w)) (runWriterT
m)
pass :: ( Monoid w, Monoid w', Monad m) => WriterT w m (a, w -> w') -> WriterT w' m a Source #
is an action that executes the action
pass
m
m
, which returns
a value and a function, and returns the value, applying the function
to the output.
-
runWriterT
(pass
m) =liftM
(\ ((a, f), w) -> (a, f w)) (runWriterT
m)
censor :: ( Monoid w, Monad m) => (w -> w) -> WriterT w m a -> WriterT w m a Source #
is an action that executes the action
censor
f m
m
and
applies the function
f
to its output, leaving the return value
unchanged.
-
censor
f m =pass
(liftM
(\ x -> (x,f)) m) -
runWriterT
(censor
f m) =liftM
(\ (a, w) -> (a, f w)) (runWriterT
m)