4

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 型の (*) 演算子を隠しているようです。

私は何を間違っていますか?

4

1 に答える 1

5

(*)オーバーロードするのではなく、演算子を再定義していることに注意してください。

それを機能させるための秘訣は、次のように中間型を使用して何かを書くことです。

type Mult = Mult with
    static member        ($) (Mult, v1: float<i>) = fun (v2: float<i>) -> 
                                 float(-1) * float(v1) * float(v2)
    static member inline ($) (Mult, v1      ) = fun v2 -> v1 * v2
    static member        ($) (Mult, v1: Mult) = fun () -> Mult //Dummy overload

let inline (*) v1 v2 = (Mult $ v1) v2

ところで、測定単位の面白い使い方。

于 2013-01-02T12:51:36.713 に答える