No, the Alternative instance should be based on semirings instead. The one you propose isn't distributive.
Lacking general semirings, the best we can do at the moment is newtypes for each semiring we have. For instance:
newtype NumConst a b = NumConst { getNumConst :: a }
deriving (Functor)
instance Num a => Applicative (NumConst a) where
pure = const (NumConst 1)
(<*>) = (coerce :: (a -> a -> a) -> NumConst a (u -> v) -> NumConst a u -> NumConst a v) (*)
instance Num a => Alternative (NumConst a) where
empty = NumConst 0
(<|>) = (coerce :: (a -> a -> a) -> NumConst a b -> NumConst a b -> NumConst a b) (+)