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