A data structure admits an Applicative
instance if it allows lifting values into the data structure.
The Applicative
typeclass extends the Apply
typeclass.
The Applicative
typeclass adds a single method which allows wrapping values in the data structure.
interface Applicative extends Apply
{
/**
* @param A $a
* @return F<A>
*/
public function pure($a);
}
Its simplified signature is
pure :: A -> F<A>
The Applicative
typeclass needs to satisfy four laws in addition to the Apply
and Functor
ones.
$applicative->apply($applicative->pure(fn($x) => $x), $y) == $y
$applicative->apply($applicative->apply($applicative->apply($applicative->pure(fn ($f, $g) => fn ($x) => $f($g($x))), $a), $b), $c) == $applicative->apply($a, $applicative->apply($b, $c))
$applicative->apply($applicative->pure($f), $applicative->pure($x)) == $applicative->pure($f($x))
$applicative->apply($f, $applicative->pure($x)) == $applicative->apply(fn (callable $g) => $g($x), $f)
EitherApplicative
ValidationApplicative
IdentityApplicative
IOApplicative
LinkedListApplicative
MaybeApplicative
PairApplicative
ReaderApplicative
StateApplicative