I'm at the edge of my competency here, so don't take this for more than it is, but it was a bit too long for a comment.
There may be practical reasons to include pure
in the type class, but many Haskell abstractions are derived from theoretical foundations, and I believe that that's the case for Applicative
as well. As the documentation says, it's a strong lax monoidal functor (see https://cstheory.stackexchange.com/q/12412/56098 for a elaboration). I suppose that pure
serves as the identity, just like return
does for Monad
(which is a monoid in the category of endofunctors).
Consider pure
and liftA2
:
pure :: a -> f a
liftA2 :: (a -> b -> c) -> f a -> f b -> f c
If you squint a little, you may be able to imagine that liftA2
is a binary operation, which is also what the documentation states:
Lift a binary function to actions.
pure
, then, is the corresponding identity.