Operador de medição de sobrecarga (*)

Eu estou preso tentando sobrecarregar o operador (*) para um tipo de medida.

O que eu gostaria de ver é:

> let x = 1.0<i> * 1.0<i>;;

val x : float = -1.0

A seguinte definição aparece para fazer o truque:

> let inline (*) (v1 : float<i>) (v2 : float<i>) = float(-1) * float(v1) * float(v2);;

val inline ( * ) : float<i> -> float<i> -> float

Observe que a medida do produto neste exemplo resolve corretamente para <1> como acontece, por exemplo, ao multiplicar a unidade imaginária de um número complexo. Sem essa definição de sobrecarga, o produto padrão é resolvido para <i ^ 2>.

Mas a definição de sobrecarga acima tem o efeito colateral desagradável que:

> let y = 1.0 * 1.0;;

let y = 1.0 * 1.0;;
--------^^^

stdin(11,9): error FS0001: This expression was expected to have type
float<i>    
but here has type
float

Aparentemente, minha definição de sobrecarga oculta o operador (*) do tipo float.

O que estou fazendo de errado?

questionAnswers(1)

yourAnswerToTheQuestion