Applicatives
Our previous example, invoking a lambda inside a wrapper with a parameter inside the same kind of wrapper, is the perfect way to introduce applicatives.
An applicative is a type that defines two functions, a pure(t: T) function that returns the T value wrapped in the applicative type, and an ap function (apply, in other languages) that receives a lambda wrapped in the applicative type.
In the previous section, when we explained monads, we made them extend directly from a functor but in reality, a monad extends from an applicative and an applicative extends from a functor. Therefore, our pseudo code for a generic applicative, and the entire hierarchy, will look like this:
interface Functor<C<_>> { //Invalid Kotlin code
fun <A,B> map(ca:C<A>, transform:(A) -> B): C<B>
}
interface Applicative<C<_>>: Functor<C> { //Invalid Kotlin code
fun <A> pure(a:A): C<A>
fun <A, B> ap(ca:C<A>, fab: C<(A...