Tacit or point-free style programming permet de créer des fonctions sans tenir compte de leurs arguments. Cela peut-il être fait en F #?Est-il possible d'écrire des fonctions tacites dans F #
Répondre
Juste pour aller avec la réponse & commentaire Chris Smith de Chuck, vous pouvez écrire
let digits = string_of_int >> String.length
digits 9000;; // 4
[1; 10; 100] |> List.map digits;; // [1;2;3]
Lorsque vous combinez les exploitants de pipelines composition & avec des fonctions d'ordre supérieur, vous pouvez faire des choses compliquées très succinctement :
let prodSqrtAbs = Seq.map (abs>>sqrt) >> Seq.reduce (*)
prodSqrtAbs [| -9.0; 4.0 |];; // 6.0
EDIT: Je viens de lire à propos de J et de son opérateur de fork implicite. C'est très puissant. Vous pouvez construire des opérateurs d'ordre supérieur équivalents dans F #, mais ils ne seront pas appliqués implicitement. Ainsi, par exemple, d'abord définir lift
(en utilisant des arguments explicites)
let lift op a b x = op (a x) (b x)
et ensuite appliquer explicitement
let avg = lift (/) List.sum List.length
pour obtenir quelque chose qui ressemble à the J example sur la page de Wikipedia, lié. Mais ce n'est pas tout à fait "tacite".
Bien sûr. Tout ce dont vous avez besoin est la composition de la fonction et la curry, et les deux sont possibles en F #.
let compose f1 f2 = fun x -> f1 (f2 x);;
let digits = compose String.length string_of_int;;
digits 9000;; // 4
J'aurais écrit composer l'inverse, de cette façon cela ressemblerait à l'opérateur >>. – Benjol
F # a les opérateurs suivants pour faire ce genre de chose >>, <<, |>, <|, ||>. –
Bonjour, Gabriel. Puis-je demander une question? L'absence d'opérateur 'fork implicite 'dans FSharp m'oblige-t-elle à n'écrire que des fonctions tacites à un argument (arguments pack dans un tuple/list etc.); mais ne me permet jamais d'écrire deux/trois/quatre /..- argument des fonctions tacites? – Bubba88