F# will always assume that the types can be heterogeneous, there's nothing in F# that gives (*) or (+) any sort of special behaviour, so it doesn't conform to an interface. Operators will usually always have an (inline) type of form
^x * ^y -> ^z
because you could technically define a
static member (*) (a: int) (b: float): double = ...
and there's nothing saying that you can't. in that case: