The main place where I see functor but not applicatives is in large product types. Consider something like
data Mean where
Unfair :: Monad a => a () -> Mean
data Foo a = Bar Int Mean a
This is easily a functor, but there's no way to make this an applicative because
(Bar i g f) (Bar i' g' a) = Bar ??? ??? (f a)
We can only fill in our ???
s with something that's a monoid-like in at least one way and Mean
never is since we have no way of specifying something to combine two values of arbitrary types g :: a
and g' :: b
in an associative way.
Additionally, we need the mempty
or something like it for pure :: a -> f a
. We're given an a
so most of the data type that involves an a
is trivial to construct, but the rest needs a sane "empty" value.
So if we smashed applicative and functor into one large type class, most of lens
would fall apart because most of the useful cases for lens involve situations just like these, where there isn't a sane Applicative
instance.
So to put this in a hand-wavey squishy way: When there's a lot of "stuff" in a type that isn't directly to do with the type parameter applicative is defined over, we need a way to merge all of this "stuff" which isn't always possible.