È possibile scrivere una funzione come apply
che accetta qualsiasi funzione F # e un array di argomenti e richiama la funzione tramite Reflection.
Tuttavia, c'è una buona ragione per cui questo non è nella libreria F # standard - uno dei punti di forza di F # (confrontato ad esempio con Mathematica) è che è un linguaggio tipizzato staticamente e può catturare la maggior parte degli errori potenziali in fase di compilazione. Se usi qualcosa come apply
allora perderai questo controllo [perché non sai mai se l'elenco ha la giusta lunghezza].
Tuttavia, ecco un esempio di come fare questo:
open Microsoft.FSharp.Reflection
let apply (f:obj) (args:obj[]) =
if FSharpType.IsFunction(f.GetType()) then
let invoke =
f.GetType().GetMethods()
|> Seq.find (fun mi -> mi.Name = "Invoke" && mi.GetParameters().Length = args.Length)
invoke.Invoke(f, args)
else failwith "Not a function"
utilizzo di esempio si presenta così:
let add a b = a + b;;
apply add [| 3;4 |];;
fonte
2013-11-28 22:13:34
non credo che questo è possibile nel caso generale, come si crea un tipo infinito che non è permesso. Tuttavia, se la dimensione della lista è nota, questo è banale. –
Questa è una domanda XY. Piuttosto che descrivere il problema che stai cercando di risolvere, hai descritto una soluzione specifica per un altro strumento (Mathematica). Se hai fornito un esempio di un problema che potresti risolvere usando "Applica" in Mathematica otterresti risposte migliori qui. –