# Ask

`Ask[F, E]`

allows us to read a value of type `E`

from a shared environment into a context `F[_]`

.
In practical terms, this means, that if we have an instance of `Ask[F, E]`

,
we can now request a value of `F[E]`

by using the `ask`

method.

Simplified, it is defined like this:

```
trait Ask[F[_], E] {
def ask: F[E]
}
```

This typeclass comes in handy whenever we want to be able to request a value from the environment, e.g. read from some external configuration.

**Instances

A trivial instance for `Ask`

can be just a plain function:

```
def functionAsk[E]: Ask[E => *, E] = new Ask[E => *, E] {
def ask: E => E = identity
}
```

Other instances include `Reader`

and `ReaderT`

/`Kleisli`

.
In fact the implementation for `ask`

is just `ReaderT.ask`

, so it's a perfect fit.

Cats-mtl is able to lift `Ask`

instances through a monad transformer stack, so for example,
`StateT[Reader[E, *], S, A]`

and `EitherT[ReaderT[List, E, *], Error, A]`

will both have `Ask`

instances whenever you import from `cats.mtl.instances._`

.

In general every monad transformer stack where `Reader`

appears once, will have an instance of `Ask`

.