dha*_*ech 6 f# symbolic-math computer-algebra-systems symbolic-computation
的象征库重载算术运算符.虽然它是用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)
Run Code Online (Sandbox Code Playgroud)
输出:
3 + 6 * x + 13 * y + z
Run Code Online (Sandbox Code Playgroud)
但是,它也会超负荷^.这当然不适合F#.
作为解决方法的一步,我导出了一个权限的方法组:
printfn "%A" (Aux.Pow(x, 2) * x)
Run Code Online (Sandbox Code Playgroud)
输出:
x ^ 3
Run Code Online (Sandbox Code Playgroud)
如何重载**以使用Aux.Pow方法组?
我可以这样做:
let ( ** ) (a: MathObject) (b: MathObject) = Aux.Pow(a, b)
Run Code Online (Sandbox Code Playgroud)
这对MathObject价值观有效:
> x ** y * x;;
val it : MathObject = x ^ (1 + y)
Run Code Online (Sandbox Code Playgroud)
但是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; }
Run Code Online (Sandbox Code Playgroud)
欢迎任何建议!
Gus*_*rra 10
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
Run Code Online (Sandbox Code Playgroud)
与链接的答案不同,我们必须使用(?< - )运算符,因为它是唯一可以取3个参数而不是2的运算符,我们需要在^运算符的左侧和右侧重载
这是相同的答案,但没有操作员.它仅适用于F#3.0,您可以使用任意数量的参数.
let inline i3 (a:^a,b:^b,c:^c) = ((^a or ^b or ^c) : (static member threeParams: ^a* ^b* ^c -> _) (a,b,c))
open Symbolism
type MathObjectOverloads =
| MathObjectOverloads
static member threeParams (MathObjectOverloads, a: #MathObject , b: int ) = MathObject.op_ExclusiveOr(a, b)
static member threeParams (MathObjectOverloads, a: #MathObject , b: #MathObject) = MathObject.op_ExclusiveOr(a, b)
static member threeParams (MathObjectOverloads, a: System.Int32, b: #MathObject) = MathObject.op_ExclusiveOr(a, b)
let inline ( ** ) a b = i3(MathObjectOverloads, a, b)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |