Eta-conversion pour les fonctions
Un grand merci à Laikoni pour cette astuce dans l'une de mes solutions .
Considérons une fonction pour, disons, additionner une chaîne avec 3 pour les lettres majuscules et 1 pour tous les autres caractères. Donc:
let counter input = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1) input
Par eta-conversion cela peut être réécrit comme:
let counter = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
et appelé de la même manière que précédemment:
counter "Hello world!" |> printfn "%i"
L'opérateur de fonction de composition vers l'avant >>
Supposons maintenant que notre défi initial consiste à additionner une chaîne avec 3 pour les lettres majuscules et 1 pour les lettres minuscules, et tous les autres caractères sont exclus.
Nous pourrions écrire ceci comme:
let counter input = Seq.filter Char.IsLetter input |> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Nous pouvons utiliser l'opérateur de composition directe ( >>
) pour enchaîner les deux fonctions ( Seq.filter
et Seq.sumBy
) ensemble. Avec eta-conversion, la définition de la fonction deviendrait:
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Chris Smith a fait un excellent article sur l' >>
opérateur sur son blog MSDN .