2009-11-27 5 views

Répondre

6

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".

+0

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

3

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 
+0

J'aurais écrit composer l'inverse, de cette façon cela ressemblerait à l'opérateur >>. – Benjol

+0

F # a les opérateurs suivants pour faire ce genre de chose >>, <<, |>, <|, ||>. –

Questions connexes