gpt4 book ai didi

f# - C#库重载^运算符。如何使用**代替?

转载 作者:行者123 更新时间:2023-12-04 13:23:34 24 4
gpt4 key购买 nike

Symbolism库使算术运算符重载。尽管它是用C#编写的,但我可以在F#中使用它:

open Symbolism

let x = new Symbol("x")
let y = new Symbol("y")
let z = new Symbol("z")

printfn "%A" (2*x + 3 + 4*x + 5*y + z + 8*y)

输出:
3 + 6 * x + 13 * y + z

但是,它也会使 ^重载功率。这当然不适用于F#。

作为解决方法的步骤,我导出了一种用于幂的方法组:
printfn "%A" (Aux.Pow(x, 2) * x)

输出:
x ^ 3

如何重载 **来使用 Aux.Pow方法组?

我可以做这样的事情:
let ( ** ) (a: MathObject) (b: MathObject) = Aux.Pow(a, b)

这确实适用于 MathObject值:
> x ** y * x;;
val it : MathObject = x ^ (1 + y)

但是 Aux.Pow也重载了 int:
    public static MathObject Pow(MathObject a, MathObject b)
{ return new Power(a, b).Simplify(); }

public static MathObject Pow(MathObject a, int b)
{ return a ^ new Integer(b); }

public static MathObject Pow(int a, MathObject b)
{ return new Integer(a) ^ b; }

任何建议欢迎!

最佳答案

您可以使用here描述的技巧,如下所示:

open Symbolism

type MathObjectOverloads =
| MathObjectOverloads
static member (?<-) (MathObjectOverloads, a: #MathObject, b: int) = MathObject.op_ExclusiveOr(a, b)
static member (?<-) (MathObjectOverloads, a: #MathObject, b: #MathObject) = MathObject.op_ExclusiveOr(a, b)
static member (?<-) (MathObjectOverloads, a: System.Int32, b: #MathObject) = MathObject.op_ExclusiveOr(a, b)

let inline ( ** ) a b = (?<-) MathObjectOverloads a b

let two = Integer(2)
let three = Integer(3)

two ** three

two ** 3

2 ** three

与链接的答案不同,我们必须使用(?<-)运算符,因为它是唯一可以接受3个参数而不是2个参数的运算符,并且我们需要在^运算符的左侧和右侧都进行重载

关于f# - C#库重载^运算符。如何使用**代替?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15343262/

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