Enumerable # du prototype dans F #?
-
09-06-2019 - |
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.
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
Cependant, utiliser Compatibility
rendra probablement les choses plus confuses pour les personnes regardant votre code.