我试图为 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
显然我的重载定义隐藏了浮点类型的 (*) 运算符。
我究竟做错了什么?