一応、Num (f a)は導出できるけど、それで定義した(+)だと
交換則(x + y = y + x)が成り立つ保証がないからじゃないかねぇ
(パーサの順番を入れ替えた場合を考えるとわかりやすい)

{-# LANGUAGE FlexibleInstances #-}
instance (Num a, Applicative f) => Num (f a) where
 x + y = (+) <$> x <*> y
 x * y = (*) <$> x <*> y
 abs x = abs <$> x
 signum x = signum <$> x
 negate x = negate <$> x
 fromInteger n = pure $ fromInteger n