Prototype Enumerable # zupfen in F #?
-
09-06-2019 - |
Frage
Sie JavaScript, um die Prototype-Bibliothek, der folgende funktionale Aufbau möglich:
var words = ["aqueous", "strength", "hated", "sesquicentennial", "area"];
words.pluck('length');
//-> [7, 8, 5, 16, 4]
Beachten Sie, dass dieses Beispiel-Code entspricht
words.map( function(word) { return word.length; } );
Ich fragte mich, ob etwas Ähnliches ist möglich in F #:
let words = ["aqueous"; "strength"; "hated";"sesquicentennial"; "area"]
//val words: string list
List.pluck 'Length' words
//int list = [7; 8; 5; 16; 4]
ohne schreiben:
List.map (fun (s:string) -> s.Length) words
Das wäre sehr nützlich, scheint mir denn dann müssen Sie nicht für jede Eigenschaft Funktionen schreiben, um auf sie zuzugreifen.
Lösung
Ich habe Ihre Anfrage auf der Fis-Mailing-Liste. Hoffe, dass ich helfen kann.
Sie können Typ-Erweiterung und Reflexion verwenden, um dies zu ermöglichen. Wir einfach den generischen Listentyp mit der zupfen Funktion erweitern. Dann können wir zupfen () auf jeder Liste verwenden. Eine unbekannte Eigenschaft wird eine Liste mit dem Fehlerstring als einziger Inhalt zurück.
type Microsoft.FSharp.Collections.List<'a> with
member list.pluck property =
try
let prop = typeof<'a>.GetProperty property
[for elm in list -> prop.GetValue(elm, [| |])]
with e->
[box <| "Error: Property '" + property + "'" +
" not found on type '" + typeof<'a>.Name + "'"]
let a = ["aqueous"; "strength"; "hated"; "sesquicentennial"; "area"]
a.pluck "Length"
a.pluck "Unknown"
, welche erzeugt die Folge Ergebnis im interaktiven Fenster:
> a.pluck "Length" ;; val it : obj list = [7; 8; 5; 16; 4] > a.pluck "Unknown";; val it : obj list = ["Error: Property 'Unknown' not found on type 'String'"]
Mit freundlichen Grüßen,
DannyAsher
> > > > >
Hinweis: Wenn <pre
mit> den spitzen Klammern um
<'a>nicht zeigen, obwohl im Vorschaufenster, um es sah gut aus. Das Graviszeichen nicht für mich arbeiten. Hatten Sie die kolorierte Version zurückgreifen, die alle falsch. Ich glaube nicht, ich poste werde hier wieder bis FSharp Syntax voll unterstützt wird.
Andere Tipps
Prototype pluck
nutzt, dass in Javascript object.method()
ist die gleiche wie object[method]
.
Leider kann man nicht nennen String.Length
entweder, weil es nicht eine statische Methode. Sie können jedoch verwendet werden:
#r "FSharp.PowerPack.dll"
open Microsoft.FSharp.Compatibility
words |> List.map String.length
Allerdings Compatibility
verwendet, wird wahrscheinlich die Dinge eher verwirrend, um Menschen in Ihrem Code suchen.