11
votes

F # transmettre un opérateur avec des arguments à une fonction

Pouvez-vous passer dans une opération comme "Diviser par 2" ou "Soustrayez 1" à l'aide d'un opérateur partiellement appliqué, où "Ajouter 1" ressemble à ceci:

List.map ((/) _ 2) [2;4;6] //not real syntax, but would equal [1;2;3] 
List.map (fun x -> x/2) [2;4;6] //real syntax equivalent of the above


0 commentaires

3 Réponses :


16
votes

Vous pouvez écrire une fonction de retournement, quelque chose comme:

let flip f x y = f y x

List.map (flip (-) 1) [2;4;6]


1 commentaires

Votre flip-fonction peut (tout aussi bien) être définie comme «laissez Flip f x y = f y x '



10
votes

Il n'y a pas de «sections d'exploitation» dans F #, un Haskell, ni des arguments d'espace réservé (apparemment un a arc). Vous pouvez utiliser un combinateur 'Flip' comme suggéré dans une autre réponse pour inverser l'ordre des arguments, puis appliquer partiellement le premier (maintenant deuxième) argument.

mais j'utiliserais simplement P>

fun x -> x / 2


0 commentaires

9
votes

the flip code> -Solution suggéré par Logan Capaldo peut également être écrit en utilisant un opérateur (ici >. code>): xxx pré>

ou si vous préférez les opérandes l'inverse: p> xxx pré>

EDIT: strong> Utiliser un opérateur qui "ressemble plus à un espace réservé" (ici > - ) vous obtient très près de votre syntaxe suggérée: p>

List.map ((-) >-< 1) [2;4;6]


1 commentaires

:) smiley. :( Frownie .: p langue.> -