Control.Monad.Trans.Writer.CPS

transformers-0.6.1.1: Concrete functor and monad transformers

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 | Haskell2010

Control.Monad.Trans.Writer.CPS

Contents

- The Writer monad
- The WriterT monad transformer
- Writer operations
- Lifting other operations

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.

Synopsis

- type Writer w = WriterT w Identity
- writer :: forall w (m :: Type -> Type) a. (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 :: Type -> Type) 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 :: forall w (m :: Type -> Type). (Monoid w, Monad m) => w -> WriterT w m ()
- listen :: forall w (m :: Type -> Type) a. (Monoid w, Monad m) => WriterT w m a -> WriterT w m (a, w)
- listens :: forall w (m :: Type -> Type) b a. (Monoid w, Monad m) => (w -> b) -> WriterT w m a -> WriterT w m (a, b)
- pass :: forall w w' (m :: Type -> Type) a. (Monoid w, Monoid w', Monad m) => WriterT w m (a, w -> w') -> WriterT w' m a
- censor :: forall w (m :: Type -> Type) a. (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

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 `m `>>=` k` combines the outputs of the subcomputations using `mappend` (also known as `<>`):

writer :: forall w (m :: Type -> Type) a. (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.

-     runWriter (mapWriter f m) = f (runWriter m)

# The WriterT monad transformer

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

A writer monad parameterized by:

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

The `return` function produces the output `mempty`, while `m `>>=` k` combines the outputs of the subcomputations using `mappend` (also known as `<>`):

#### Instances

Instances details

MonadTrans (WriterT w) Source # |
Instance details Defined in Control.Monad.Trans.Writer.CPS Methods lift :: Monad m => m a -> WriterT w m a Source #
MonadIO m => MonadIO (WriterT w m) Source # |
Instance details Defined in Control.Monad.Trans.Writer.CPS Methods liftIO :: IO a -> WriterT w m a Source #
(Functor m, MonadPlus m) => Alternative (WriterT w m) Source # |
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, Monad m) => Applicative (WriterT w m) Source # |
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 #
Functor m => Functor (WriterT w m) Source # |
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 #
Monad m => Monad (WriterT w m) Source # |
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, MonadPlus m) => MonadPlus (WriterT w m) Source # |
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 #
MonadFail m => MonadFail (WriterT w m) Source # |
Instance details Defined in Control.Monad.Trans.Writer.CPS Methods fail :: String -> WriterT w m a #
MonadFix m => MonadFix (WriterT w m) Source # |
Instance details Defined in Control.Monad.Trans.Writer.CPS Methods mfix :: (a -> WriterT w m a) -> WriterT w m a #
Generic (WriterT w m a) Source # |
Instance details Defined in Control.Monad.Trans.Writer.CPS Associated Types
type Rep (WriterT w m a) |
Instance details Defined in Control.Monad.Trans.Writer.CPS type Rep (WriterT w m a) = D1 ('MetaData "WriterT" "Control.Monad.Trans.Writer.CPS" "transformers-0.6.1.1-2ce2" 'True) (C1 ('MetaCons "WriterT" 'PrefixI 'True) (S1 ('MetaSel ('Just "unWriterT") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (w -> m (a, w)))))
Methods from :: WriterT w m a -> Rep (WriterT w m a) x # to :: Rep (WriterT w m a) x -> WriterT w m a #
type Rep (WriterT w m a) Source # |
Instance details Defined in Control.Monad.Trans.Writer.CPS type Rep (WriterT w m a) = D1 ('MetaData "WriterT" "Control.Monad.Trans.Writer.CPS" "transformers-0.6.1.1-2ce2" 'True) (C1 ('MetaCons "WriterT" 'PrefixI 'True) (S1 ('MetaSel ('Just "unWriterT") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (w -> m (a, w)))))

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 :: forall w (m :: Type -> Type). (Monoid w, Monad m) => w -> WriterT w m () Source #

``tell` w` is an action that produces the output `w`.

listen :: forall w (m :: Type -> Type) a. (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 :: forall w (m :: Type -> Type) b a. (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 :: forall w w' (m :: Type -> Type) a. (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 :: forall w (m :: Type -> Type) a. (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.