gpt4 book ai didi

f# - 重载度量​​运算符 (*)

转载 作者:行者123 更新时间:2023-12-05 01:13:25 26 4
gpt4 key购买 nike

我被困在尝试为 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

显然,我的重载定义隐藏了浮点类型的 (*) 运算符。

我究竟做错了什么?

最佳答案

请注意,您正在重新定义 (*)运算符而不是重载它。

让它工作的技巧是使用中间类型编写一些东西,如下所示:

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

顺便说一句,使用度量单位的有趣方式。

关于f# - 重载度量​​运算符 (*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14121556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com