We can use an Applicative all the way:
Prelude> pure (*) <*> (Just 2) <*> (Just 3)
Just 6
But we can also use a Functor and then Applicative for the rest of the computation:
Prelude> (*) <$> (Just 2) <*> (Just 3)
Just 6
From Typeclassopedia:
Why do we need Applicative to implement this generalization of fmap? Suppose we use
fmapto applygto the first parameterx1. Then we get something of typef (t2 -> ... t), but now we are stuck: we can’t apply this function-in-a-context to the next argument withfmap. However, this is precisely what(<*>)allows us to do. This suggests the proper translation of the idealized notation[[g \; x_1 \; x_2 \; \cdots \; x_n]]\into Haskell, namelyg <$> x1 <*> x2 <*> ... <*> xn,