重载度量​​运算符(*)

时间:2013-01-02 11:51:07

标签: f#

我试图重置一个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

请注意,此示例中的产品度量正确地解析为&lt; 1&gt;。例如,当乘以复数的虚数单位时会发生这种情况。如果没有此重载定义,则默认产品将解析为&lt; 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类型的(*)运算符。

我做错了什么?

1 个答案:

答案 0 :(得分: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
使用计量单位的BTW搞笑方式。