## MTL classes summary

`Tell[F, L]`

is the ability to “log” values `L`

inside a context `F[_]`

, as an effect.
The primary monad transformer instance for `Tell`

is `WriterT`

.

`Listen[F, L]`

extends `Tell`

and gives you the ability to expose the state
that is contained in all `F[A]`

values, and that can be modified using `tell`

.
In that sense it is equivalent to a function `F[A] => F[(A, L)]`

.
The primary monad transformer instance for `Listen`

is `WriterT`

.

`Ask[F, E]`

lets you access an `E`

value in the `F[_]`

context.
Intuitively, this means that an `E`

value is required as an input to get “out” of the `F[_]`

context.
The primary monad transformer instance for `Ask`

is `ReaderT`

.

`Local[F, E]`

extends `Ask`

and lets you substitute all of the `ask`

occurrences in an `F[A]`

value with
`ask.map(f)`

, for some `f: E => E`

which produces a modified `E`

input.
The primary monad transformer instance for `Local`

is `ReaderT`

.

`Stateful[F, S]`

is the capability to access and modify a state value
from inside the `F[_]`

context, using `set(s: S): F[Unit]`

and `get: F[S]`

.
The primary monad transformer instance for `Stateful`

is `StateT`

.

`Chronicle[F, E]`

is the ability to both accumulate outputs and aborting computation with a final output.
In that sense it can be seen as a hybrid of `Handle`

and `Tell`

.
The primary monad transformer instance for `Chronicle`

is `IorT`

.

`Raise[F, E]`

expresses the ability to raise errors of type `E`

in a functorial `F[_]`

context.
This means that a value of type `F[A]`

may contain no `A`

values but instead an `E`

error value,
and further `map`

calls will not have any values to execute the passed function on.
The primary monad transformer instance for `Raise`

is `EitherT`

.

`Handle[F, E]`

extends `Raise`

with the ability to also handle raised errors.
It is fully equivalent to `cats.ApplicativeError`

, but is not a subtype of `Applicative`

and therefore doesn’t cause any ambiguitites.
The primary monad transformer instance for `Handle`

is `EitherT`

.