2011-05-27 16 views
21

que define un operador de igualdad a medida (la definición no es muy importante así que voy a insertar material ficticio):OCaml: ¿Por qué no puedo usar este operador infijo?

let (~=~) a b = true 

Si trato de usarlo INFIX:

if a ~=~ b then 1 else 2 

me sale el siguiente error : This expression is not a function; it cannot be applied.

Puedo solucionar esto ya sea cambiando el nombre del operador de ~=~ a =~ o llamándolo como una función: if (~=~) a b then 1 else 2.

Esto parece ser un problema general con los operadores que comienzan con ~. Mi pregunta es por qué no puedo usar esos operadores infijo? ¿Hay algo especial sobre el símbolo ~?

Nota: Ya revisé la documentación pero no pude encontrar nada relevante. Tal vez me perdí algo?

Respuesta

45

En OCaml, si un operador es infijos o prefijo está determinada por su primer carácter. En tu caso, el caracter '~' es para el prefijo: por let (~ = ~) a b = ..., estás definiendo un operador de prefijo. ~ = ~ a es una expresión válida y devuelve una función.

Además del infijo o prefijo, la asociatividad del operador infijo (izquierda o derecha) y las precedencias del operador (¿cuál de las teclas + y * tiene más fuerte?) Se determinan sintácticamente por el primer carácter del operador.

Esto suena feo, ya que no puede tener el control de las características de sus operadores sofisticados, pero hace que sea más fácil leer el código fuente OCaml por otra persona con muchos operadores personalizados extraños.

Aquí está la tabla de caracteres para los operadores:

The first char : prefix/infix/connectivity power/left-or-right 
! ~ ?   : prefix 
= < > | & $  : infix0, left 
@^   : infix1, right 
+ -    : infix2, left 
*/   : infix3, left (** is exceptional. It is right assoc and have power 4) 
+1

respuesta Niza :) Gracias! Todo despejado ahora. – Calin

+2

¿En qué parte del documento oficial está presente esta información? No pude encontrar la parte sobre asociatividad derecha/izquierda. – Ricardo

+4

@Ricardo: hay una tabla de precedencia del operador en http://caml.inria.fr/pub/docs/manual-ocaml/expr.html (cerca de la parte superior). Tenga en cuenta que en primer lugar enumera los operadores de mayor precedencia. –

Cuestiones relacionadas