Arbeiten mit Zeichenketten in F # ist manchmal ein bisschen unangenehm. Ich würde wahrscheinlich den gleichen Code wie Dario verwenden. Die F # -Grammatik erlaubt es nicht, Konstruktoren als First-Class-Funktionen zu verwenden, so dass Sie leider nicht die gesamte Verarbeitung in einer einzigen Pipeline durchführen können. Im Allgemeinen können Sie statische Member und Instanzmethoden als First-Class-Funktionen verwenden, nicht jedoch Instanzeigenschaften oder Konstruktoren.
Wie auch immer, es gibt einen wirklich fiesen Trick, den Sie verwenden können, um einen Konstruktor in einen Funktionswert zu verwandeln. Ich würde nicht wirklich empfehlen es, aber ich war ziemlich überrascht zu sehen, dass es tatsächlich funktioniert, so dass ich dachte, es kann sich lohnen, sie teilen
let inline ctor< ^R, ^T
when ^R : (static member ``.ctor`` : ^T -> ^R)> (arg:^T) =
(^R : (static member ``.ctor`` : ^T -> ^R) arg)
Dies definiert eine Funktion, die bei der Kompilierung inlined werden, die erfordert, dass der erste Typparameter einen Konstruktor hat, der einen Wert des zweiten Typparameters annimmt. Dies wird als Kompilierzeit-Einschränkung angegeben (weil .NET-Generics dies nicht ausdrücken können). Außerdem können Sie in F # nicht die übliche Syntax zum Angeben von Konstruktoreinschränkungen angeben (die unit
als Argument annehmen muss), aber Sie können den kompilierten Namen der Konstruktoren verwenden. Jetzt können Sie zum Beispiel schreiben:
// just like 'new System.Random(10)'
let rnd = ctor<System.Random, _> 10
rnd.Next(10)
Und Sie können auch das Ergebnis der ctor
als First-Class-Funktion:
let chars = [ 'a'; 'b'; 'c' ]
let str = chars |> Array.ofSeq |> ctor<System.String, _>
Wie gesagt, ich denke, das ist in erster Linie eine Kuriosität, sondern ein ziemlich interessant :-).
OK, macht diese Einschränkung Sinn Performance-weise (eine Lambda schaffen, die sie wahrscheinlich schaden Leistung zu optimieren wahrscheinlich schwer kann die schwer zu erkennen). Irgendein Zeiger auf, warum 'neu' ist optional? Um das Erstellen von Objekten durch Reflektion besser mit der Ocaml/F # -Syntax zu verschmelzen? Vielen Dank! –
Art von schwer zu einer der Antworten zu wählen, werde ich dieses wählen, weil es eine andere verwandte Frage verweist. :-) –
"Es scheint, Objekt Konstruktoren sind nicht zusammensetzbar, so dass Sie sie nicht als Funktion übergeben können." Dies ändert sich endlich. https://github.com/fsharp/FSharpLangDesign/blob/master/FSharp-4.0/ClassNamesAsFunctionsDesignAndSpec.md – Endrju