mtl-2.3.1: 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.Strict

Description

Strict writer monads.

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.

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: mtl-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: mtl-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 (ExceptT e m) Source #

Since: mtl-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 #

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 (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 (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 #

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

Since: mtl-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 (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 (RWST r w s m) Source #

Since: mtl-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 #

(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 #

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

runWriter :: Writer w a -> (a, w) Source #

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

execWriter :: Writer w a -> w Source #

Extract the output from a writer computation.

mapWriter :: ((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

newtype 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 >>= combines the outputs of the subcomputations using mappend.

Constructors

WriterT 

Fields

Instances

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

Since: mtl-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 # 
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 # 
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, Monoid w) => 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: mtl-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 # 
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 # 
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 => MonadTrans (WriterT w) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

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

Defined in Control.Monad.Trans.Writer.Strict

Methods

fail :: String -> WriterT w m a Source #

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

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

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

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

(Monoid w, MonadZip m) => MonadZip (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

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

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

Foldable f => Foldable (WriterT w f) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

fold :: Monoid m => WriterT w f m -> m Source #

foldMap :: Monoid m => (a -> m) -> WriterT w f a -> m Source #

foldMap' :: Monoid m => (a -> m) -> WriterT w f a -> m Source #

foldr :: (a -> b -> b) -> b -> WriterT w f a -> b Source #

foldr' :: (a -> b -> b) -> b -> WriterT w f a -> b Source #

foldl :: (b -> a -> b) -> b -> WriterT w f a -> b Source #

foldl' :: (b -> a -> b) -> b -> WriterT w f a -> b Source #

foldr1 :: (a -> a -> a) -> WriterT w f a -> a Source #

foldl1 :: (a -> a -> a) -> WriterT w f a -> a Source #

toList :: WriterT w f a -> [a] Source #

null :: WriterT w f a -> Bool Source #

length :: WriterT w f a -> Int Source #

elem :: Eq a => a -> WriterT w f a -> Bool Source #

maximum :: Ord a => WriterT w f a -> a Source #

minimum :: Ord a => WriterT w f a -> a Source #

sum :: Num a => WriterT w f a -> a Source #

product :: Num a => WriterT w f a -> a Source #

(Eq w, Eq1 m) => Eq1 (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

(Ord w, Ord1 m) => Ord1 (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

(Read w, Read1 m) => Read1 (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (WriterT w m a) Source #

liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [WriterT w m a] Source #

liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec (WriterT w m a) Source #

liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [WriterT w m a] Source #

(Show w, Show1 m) => Show1 (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> WriterT w m a -> ShowS Source #

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [WriterT w m a] -> ShowS Source #

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

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

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

Traversable f => Traversable (WriterT w f) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

traverse :: Applicative f0 => (a -> f0 b) -> WriterT w f a -> f0 (WriterT w f b) Source #

sequenceA :: Applicative f0 => WriterT w f (f0 a) -> f0 (WriterT w f a) Source #

mapM :: Monad m => (a -> m b) -> WriterT w f a -> m (WriterT w f b) Source #

sequence :: Monad m => WriterT w f (m a) -> m (WriterT w f a) Source #

(Monoid w, Alternative m) => Alternative (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

empty :: WriterT w m a Source #

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

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

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

(Monoid w, Applicative m) => Applicative (WriterT w m) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

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 #

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

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

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

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

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

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

return :: a -> WriterT w m a Source #

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

Defined in Control.Monad.Trans.Writer.Strict

Methods

mzero :: WriterT w m a Source #

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

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

Defined in Control.Monad.Cont.Class

Methods

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

Generic (WriterT w m a) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Associated Types

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

Methods

from :: WriterT w m a -> Rep (WriterT w m a) x Source #

to :: Rep (WriterT w m a) x -> WriterT w m a Source #

(Read w, Read1 m, Read a) => Read (WriterT w m a) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

(Show w, Show1 m, Show a) => Show (WriterT w m a) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

showsPrec :: Int -> WriterT w m a -> ShowS Source #

show :: WriterT w m a -> String Source #

showList :: [WriterT w m a] -> ShowS Source #

(Eq w, Eq1 m, Eq a) => Eq (WriterT w m a) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

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

(/=) :: WriterT w m a -> WriterT w m a -> Bool #

(Ord w, Ord1 m, Ord a) => Ord (WriterT w m a) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

Methods

compare :: WriterT w m a -> WriterT w m a -> Ordering #

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

(<=) :: WriterT w m a -> WriterT w m a -> Bool #

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

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

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

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

type Rep (WriterT w m a) 
Instance details

Defined in Control.Monad.Trans.Writer.Strict

type Rep (WriterT w m a) = D1 ('MetaData "WriterT" "Control.Monad.Trans.Writer.Strict" "transformers-0.6.0.6" 'True) (C1 ('MetaCons "WriterT" 'PrefixI 'True) (S1 ('MetaSel ('Just "runWriterT") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (m (a, w)))))

execWriterT :: Monad m => WriterT w m a -> m w Source #

Extract the output from a writer computation.

mapWriterT :: (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.