As a raw datatype definition that you've quoted, Sum a
isn't actually useful - it just trivially wraps another type. And this wouldn't become any more useful with a Num a
constraint, even if that actually did anything in practice.
What Sum
is in practice used for is to make Semigroup
and Monoid
instances for numeric types, based on addition (and avoid privileging this instance over other possible ones by attaching it directly to the underlying type):
instance (Num a) => Semigroup (Sum a) where
(<>) = (+)
and here of course the constraint is necessary. But these instances are the only reason the type even exists, and there's no gain in including a constraint in the type definition.