【发布时间】:2013-03-14 05:17:38
【问题描述】:
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; }
欢迎提出任何建议!
【问题讨论】:
-
不能用其他操作数类型声明相同的函数吗?
-
嗨@JonSkeet。我认为 F# 运算符(函数)不会像 C# 方法那样重载。你是这个意思吗?
标签: f# symbolic-math computer-algebra-systems symbolic-computation