2010-11-22 22 views
7

¿Hay alguna forma de cambiar el orden de asociación asociativa izquierda a asociación derecha, excepto paréntesis? Por ejemplo, en Haskell puede escribir foo $ bar b y foo se aplicará a un resultado de bar b.Cambiar el orden de solicitud en OCaml

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

let c = a ??? b 3;; 

print_int c;; 

debe imprimir 20

Respuesta

6

Claro, usted puede definir usted mismo:

let (@@@) f x = f x 

Entonces, a @@@ b 3 evalúa a 20. Asegúrese de seleccionar un símbolo de partida tal que es asociativo por la derecha (see here) ($... es asociativo de la izquierda)

+1

Se podía definir un operador '$' como en Haskell: dejar ($) fx = fx ;; – aneccodeal

+1

No, en realidad, no puede usar '$'. Funciona para este ejemplo básico, pero no si intenta 'f $ g $ h x' –

4

Simplemente tiene que definir un símbolo para tales aplicaciones:

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

Y luego

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

se imprime 20.

Tenga en cuenta que la próxima versión de OCaml (3,13 o 4,00) proporcionará primitivas incorporadas para aplicaciones que evitan la creación de funciones intermedias aplicadas parcialmente:

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

el último es lo contrario de %apply :

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

Tenga en cuenta que no se puede utilizar ($), ya que es asociativo por la izquierda en la definición del analizador 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

¿Por qué no el @@ instead @@@ más corto? ¿Ya se usa en la biblioteca estándar? – Ricardo

Cuestiones relacionadas