interface Functor f => Applicative f where
pure : a -> f a
(<*>) : f (a -> b) -> f a -> f b
A Functor that can also lift a pure value into the context (pure) and apply a wrapped function to a wrapped argument ((<*>), "apply").
Laws (for reference): pure id <*> v == v, and pure distributes over application. pure x injects x without any effect; pf <*> px runs pf and px and applies the one to the other.