First, look at the source :
ap m1 m2 = do { x1 <- m1; x2 <- m2; return (x1 x2) }
-- Since many Applicative instances define (<*>) = ap, we
-- cannot define ap = (<*>)
( ), , , (->) [a]. , ap (<*>),
instance Applicative ((->) a) where
pure = const
(<*>) f g x = f x (g x)
(<*>) zip tail x = zip x (tail x), x zip <*> tail = \x -> zip x (tail x).
ap instance Monad (->) a , <*>, .
, , \x → zip x (tail (tail x)).
: m (a -> b) -> m a -> m b is (c -> (a -> b)) -> (c -> a) -> (c -> b) , ap f1 f2 f2 : c -> a f2 (f2 <anything>) typecheck.