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

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的运算符,我们需要在^运算符的左侧和右侧重载

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...