我试图重置一个Measure类型的(*)运算符.
我想看到的是:
> let x = 1.0<i> * 1.0<i>;;
val x : float = -1.0
Run Code Online (Sandbox Code Playgroud)
以下定义似乎可以解决问题:
> let inline (*) (v1 : float<i>) (v2 : float<i>) = float(-1) * float(v1) * float(v2);;
val inline ( * ) : float<i> -> float<i> -> float
Run Code Online (Sandbox Code Playgroud)
请注意,此示例中的乘积度量正确地解析为<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
Run Code Online (Sandbox Code Playgroud)
显然,我的重载定义隐藏了浮点类型的(*)运算符.
我究竟做错了什么?
请注意,您正在重新定义(*)运算符而不是重载它.
让它工作的技巧是使用中间类型编写一些东西,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
BTW有趣的方式使用计量单位.