2010-11-22 2 views
7

Existe-t-il un moyen de changer l'ordre de gauche-associatif à droit-associatif, à l'exception des parenthèses? Par exemple dans Haskell vous pouvez écrire foo $ bar b et foo sera appliqué à un résultat de bar b.Modifier l'ordre d'application dans OCaml

let a x = x * 4;; 
let b y = y + 2;; 

let c = a ??? b 3;; 

print_int c;; 

devrait imprimer 20

Répondre

6

Bien sûr, vous pouvez définir vous-même:

let (@@@) f x = f x 

Ensuite, a @@@ b 3 évalue à 20. Assurez-vous de choisir un symbole de départ tel qu'il est droit associatif (see here) ($... est de gauche associative)

+1

Vous pouvez définir juste un opérateur « $ » comme dans Haskell: laisser ($) fx = fx ;; – aneccodeal

+1

Non, en fait, vous ne pouvez pas utiliser '$'. Cela fonctionne pour cet exemple basique, mais pas si vous essayez 'f $ g $ h x' –

4

Vous avez juste à définir un symbole pour de telles applications:

let (@@@) f x = f x ;; 

Et puis

let f x = x * 4;; 
let g y = y + 2;; 
let a = f @@@ g 3;; 
print_int a;; 

ne imprime 20.

Notez que la prochaine version de OCaml (3,13 ou 4,00) fournira des primitives BUILTIN pour les applications qui permettent d'éviter la création de fonctions intermédiaires partiellement appliquées:

external (@@@) : ('a -> 'b) -> 'a -> 'b = "%apply" 
external (|>) : 'a -> ('a -> 'b) -> 'b = "%revapply" 

le dernier est à l'opposé de %apply :

print_int (3 |> g |> f);; 

Notez que vous ne pouvez pas utiliser ($) comme il est laissé associatif dans la définition de l'analyseur OCaml:

let ($) f x = f x ;; 
let a = f $ g 3;;  (* ok ! ??? *) 
let a = f $ g $ g 3;; (* ERROR -> g is not an integer, 
         because OCaml computes (f $ g) first *) 
+0

Pourquoi pas le plus court @@ au lieu de @@@? Est-il déjà utilisé dans la bibliothèque standard? – Ricardo