So (+) would be defined as adding its operands, except if one of them is an error (in which case the result would be an error).
C Foo(A a) = ...
Someone then provides me with some not-A error value. What should I do? What do you mean by implicit.
Product types work as well, if you want. But unless your return type is a monoid (or like, a semilattice maybe?) then you're going to end up with Sum Types somewhere.
The vast, vast majority of software engineers and students work with sum types every day and they're totally fine with them. Most languages implicitly sum many values with null.