Question

En JavaScript, à l'aide de la bibliothèque Prototype, la construction fonctionnelle suivante est possible:

var words = ["aqueous", "strength", "hated", "sesquicentennial", "area"];
words.pluck('length');
//-> [7, 8, 5, 16, 4]

Notez que cet exemple de code est équivalent à

.
words.map( function(word) { return word.length; } );

Je me suis demandé si quelque chose de similaire était possible en F #:

let words = ["aqueous"; "strength"; "hated";"sesquicentennial"; "area"]
//val words: string list
List.pluck 'Length' words
//int list = [7; 8; 5; 16; 4]

sans avoir à écrire:

List.map (fun (s:string) -> s.Length) words

Cela me semble très utile car vous n'avez pas besoin d'écrire des fonctions pour chaque propriété pour y accéder.

Était-ce utile?

La solution

J'ai vu votre demande sur la liste de diffusion F #. J'espère que je peux aider.

Vous pouvez utiliser l'extension de type et la réflexion pour permettre cela. Nous étendons simplement le type de liste générique avec la fonction pluck. Ensuite, nous pouvons utiliser pluck () sur n’importe quelle liste. Une propriété inconnue renverra une liste avec la chaîne d'erreur comme seul contenu.

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"

qui produit le résultat suivant dans la fenêtre interactive:

> 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'"]

Cordialement,

DannyAsher

> > > > >

REMARQUE: lors de l’utilisation de <pre > les crochets

<'a>
n’apparaissaient pas bien dans la fenêtre d’aperçu. Le backtick n'a pas fonctionné pour moi. Devait vous recourir à la version colorisée qui est tout faux. Je ne pense pas que je publierai de nouveau ici jusqu'à ce que la syntaxe FSharp soit entièrement prise en charge.

Autres conseils

Le prototype pluck tire parti de ce qui est en Javascript object.method() est identique à object[method].

Malheureusement, vous ne pouvez pas appeler String.Length non plus, car ce n'est pas une méthode statique. Vous pouvez cependant utiliser:

#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

Cependant, utiliser Compatibility rendra probablement les choses plus confuses pour les personnes regardant votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top