La libreria Symbolism sovraccarica gli operatori aritmetici. Anche se è scritto in C# posso usarlo da F #:Sovraccarico di librerie C# operatore. Come usare ** invece?
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)
l'output:
3 + 6 * x + 13 * y + z
Tuttavia, sovraccarica anche ^
per potenze. Questo ovviamente non funziona bene con F #.
Come un passo verso una soluzione, ho esportato un gruppo di metodo per potenze:
printfn "%A" (Aux.Pow(x, 2) * x)
uscita:
x^3
Come posso sovraccaricare **
di utilizzare il gruppo Aux.Pow
metodo, invece?
posso fare qualcosa di simile:
let (**) (a: MathObject) (b: MathObject) = Aux.Pow(a, b)
E questo funziona per MathObject
valori:
> x ** y * x;;
val it : MathObject = x^(1 + y)
Ma Aux.Pow
è sovraccarico per int
così:
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; }
Eventuali suggerimenti benvenuto!
Non si possono dichiarare le stesse funzioni con gli altri tipi di operandi? –
Ciao @JonSkeet. Non credo che gli operatori di F # (funzioni) sovraccarichino il modo in cui i metodi C# fanno. E 'questo che intendevi? – dharmatech