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.

War es hilfreich?

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 

http://research.microsoft .com / FSharp / manual / FSharp.PowerPack / Microsoft.FSharp.Compatibility.String.html

Allerdings Compatibility verwendet, wird wahrscheinlich die Dinge eher verwirrend, um Menschen in Ihrem Code suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top