2012-03-10 21 views
5

Suponga que una función bind tiene un argumento etiquetado, argumentos opcionales y argumentos no etiquetados, y desea definir un método m que aplica los argumentos no etiquetados de bind y devuelve la función parcialmente aplicada, de modo que el usuario de m puede aplicar los argumentos etiquetados u opcionales de bind. ¿Cómo haces esto? Simplemente escribir method m = bind a b [...] z hace que el compilador piense que se omiten los argumentos opcionales.Cómo curry una función w.r.t. sus argumentos opcionales en OCaml

Respuesta

11

La posición de los argumentos opcionales (en la declaración de función o tipo de función) es importante: solo se aplican implícitamente cuando se aplica el siguiente argumento no opcional.

Si desea que la aplicación parcial de un parámetro a p se aplica un parámetro opcional ?o, poner ?o después p en la declaración de la función.

contraste

# let f ?o p ~z =();; 
val f : ?o:'a -> 'b -> z:'c -> unit = <fun> 
# f 1;; 
- : z:'_a -> unit = <fun> (* ?o applied *) 

con:

# let f p ?o ~z =();; 
val f : 'a -> ?o:'b -> z:'c -> unit = <fun> 
# f 1;; 
- : ?o:'_a -> z:'_b -> unit = <fun> (* ?o not applied *) 

Si no desea cambiar el orden de definición, o quiere parcialmente aplican todos los parámetros no opcionales, que necesita para capturar de forma explícita los parámetros opcionales que se pueden transmitir de forma implícita:

# (fun ?o() -> f ?o 1 ~z:2);; 
- : ?o:'a -> unit -> unit = <fun> 

En caso de que no estaban familiarizados con ella, la sintaxis ?o en el sitio llamado es muy útil para esto: se necesita un 'a option y hace lo correcto a transparente pasar un argumento opcional, tanto si se aplica o no, a la Llamado

he añadido un último () parámetro para preservar la propiedad de que no es al menos un argumento que no es opcional después de los opcionales. Es posible no hacer esto, pero se vuelve complicado y no es aconsejable.

+0

En el último párrafo, ¿es necesario el último() parámetro incluso en la definición del método? – Pteromys

+1

Bueno, nunca es obligatorio, pero recibirá una advertencia y no tendrá forma de disparar implícitamente (ya que no puede "pasar el siguiente argumento no opcional" para esto), por lo que será como un no opcional parámetro de tipo 'opción'. – gasche

Cuestiones relacionadas