加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:07:52 所属栏目:百科 来源:网络整理
导读:Symbolism库重载算术运算符.虽然它是用C#编写的,但我可以在F#中使用它: open Symbolismlet 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 然而,它也超过
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,b: #MathObject) = MathObject.op_ExclusiveOr(a,a: System.Int32,b)

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

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

two ** three

two ** 3

2 ** three

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读