2013-11-28 9 views
6

Anwendung Wie zum Anlegen einer Liste von Werten an eine Funktion wie die Apply (@@) symbol in mathematica eine Funktion in F # schreibeneine Liste einer Funktion Argumente

zum Beispiel (Kartenelemente der Liste Argumente funktionieren) apply f [1;2;3] ruft f(1,2,3) oder als in curried Funktion Anwendung f 1 2 3

+0

Ich glaube nicht, das ist möglich, im allgemeinen Fall, wie Sie erstellen ein unendlicher Typ, der nicht erlaubt ist. Wenn jedoch die Größe der Liste bekannt ist, ist dies trivial. –

+0

Dies ist eine XY-Frage. Anstatt das Problem zu beschreiben, das Sie zu lösen versuchen, haben Sie eine Lösung beschrieben, die für ein anderes Werkzeug (Mathematica) spezifisch ist. Wenn Sie ein Beispiel für ein Problem nennen, das Sie mit "Apply" in Mathematica lösen könnten, würden Sie hier bessere Antworten erhalten. –

Antwort

9

Sie können eine Funktion wie apply schreiben, die jede F # -Funktion und ein Array von Argumenten übernimmt und die Funktion über Reflection aufruft.

Es gibt jedoch einen guten Grund, warum dies nicht in der Standard F # -Bibliothek ist - eine der Stärken von F # (im Vergleich zu Mathematica) ist, dass es eine statisch typisierte Sprache ist und die meisten möglichen Fehler zur Kompilierungszeit erfassen kann. Wenn Sie etwas wie apply verwenden, verlieren Sie diese Überprüfung [weil Sie nie wissen, ob die Liste die richtige Länge hat].

Dennoch, hier ist ein Beispiel dafür, wie dies zu tun:

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" 

Beispiel Verwendung sieht wie folgt aus:

let add a b = a + b;; 
apply add [| 3;4 |];; 
Verwandte Themen