Measure 型の (*) 演算子をオーバーロードしようとして行き詰まりました。
私が見たいのは:
> let x = 1.0<i> * 1.0<i>;;
val x : float = -1.0
次の定義は、トリックを行うように見えます:
> let inline (*) (v1 : float<i>) (v2 : float<i>) = float(-1) * float(v1) * float(v2);;
val inline ( * ) : float<i> -> float<i> -> float
この例の積メジャーは、たとえば複素数の虚数単位を乗算するときに発生するように、<1> に正しく解決されることに注意してください。このオーバーロード定義がないと、デフォルトの積は < i^2> に解決されます。
しかし、上記のオーバーロードの定義には、次のような厄介な副作用があります。
> 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
どうやら私のオーバーロード定義は、float 型の (*) 演算子を隠しているようです。
私は何を間違っていますか?