Control.Monad.Trans.Writer.CPS
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 | [email protected] |
Stability | experimental |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell98 |
Description
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.
The Writer monad
type Writer w = WriterT w Identity Source
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
.
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)
mapWriter :: (Monoid w, Monoid w') => ((a, w) -> (b, w')) -> Writer w a -> Writer w' b Source
Map both the return value and output of a computation using the given function.
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) | |
Defined in Control.Monad.Trans.Writer.CPS | |
Monad m => Monad (WriterT w m) | |
Functor m => Functor (WriterT w m) | |
MonadFix m => MonadFix (WriterT w m) | |
Defined in Control.Monad.Trans.Writer.CPS | |
MonadFail m => MonadFail (WriterT w m) | |
Defined in Control.Monad.Trans.Writer.CPS | |
(Functor m, Monad m) => Applicative (WriterT w m) | |
Defined in Control.Monad.Trans.Writer.CPS Methodspure :: 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) | |
Defined in Control.Monad.Trans.Writer.CPS | |
(Functor m, MonadPlus m) => Alternative (WriterT w m) | |
(Functor m, MonadPlus m) => MonadPlus (WriterT w m) | |
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
tell w
is an action that produces the output w
.
listen :: (Monoid w, Monad m) => WriterT w m a -> WriterT w m (a, w) Source
listen m
is an action that executes the action 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
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.
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
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.
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
censor f m
is an action that executes the action 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)
Lifting other operations
liftCallCC :: CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b Source
Uniform lifting of a callCC
operation to the new monad. This version rolls back to the original state on entering the continuation.
liftCatch :: Catch e m (a, w) -> Catch e (WriterT w m) a Source
Lift a catchE
operation to the new monad.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/transformers-0.5.6.2/Control-Monad-Trans-Writer-CPS.html