Using the applicative style, there is no need to put intermediate results in a tuple in order to immediately apply the unprocessed function. Just apply the function "directly" with <$> and <*> .
try ((*) <$> pFactor <*> (char '*' *> pTerm))
In general, assuming the correct Monad and Applicative instances,
do x0 <- m0 x1 <- m1 ... return $ f x0 x1 ...
equivalently
f <$> m0 <*> m1 <*> ...
except that the latter form is more general and requires only an Applicative instance. (All monads should also be applicative functors, although language does not provide this).
source share