It's undecidable if the language used to define operators is sufficiently expressive. Even simple syntactic constraints would work well enough for most scenarios, like "operators may only be defined by an expression containing other operators".
New types also don't have to inherit the properties of the operators they use.
In any case, my point was that there are multiple avenues to explore in providing operators in a way that don't compromise the compiler's ability to optimize numerical code.
Also, you mentioned matrices in the previous comment, but multiplication between matrices is not commutative.