2011-11-15 26 views
23

Deje f x y = x * y. Podemos aplicar esta función de dos maneras: f 5 6, o, usando notación infija, 5 `f` 6. ¿Las reglas del operador se aplican a esta última expresión? ¿Qué precedencia tendrá esta aplicación? ¿Es solo otra forma de aplicación de función, y también tendrá la más alta prioridad?Función de función de infijo Haskell precedencia

Supongo que el compilador ve esta forma especial (debido a `` y/o el nombre que comienza con una letra (?)), Y realmente la trata como una aplicación de función normal, en lugar de considerarla un operador.

+2

La sintaxis de Haskell 98 permite elegir el nivel de precedencia, ver http://www.haskell.org/onlinereport/decls.html#fixity para más detalles. –

+0

¡Gracias a Atal S-Z por la edición! – demi

Respuesta

22

El Haskell 98 Report tiene una sección sobre Operator Applications que lo aclara:

Un operador es o bien un símbolo de operador, tales como + o $$, o es un identificador ordinario encerrado en acento grave (comillas inversas) , como `op`. Por ejemplo, en lugar de escribir la aplicación de prefijo op x y, , uno puede escribir la aplicación infijo x `op` y. Si no se proporciona una declaración de fijeza para `op`, su valor predeterminado es la precedencia más alta y deja asociatividad (consulte la Sección 4.4.2).

Como se indica por las otras respuestas, el informe también tiene una sección sobre Fixity Declarations que le permite definir su propia fijeza, por ejemplo:

infixl 7 `op` 
9

Si no se proporciona una declaración de rigidez explícita, como p. Ej.

infixl 7 `quot` 

una función infija backticked tiene la fijeza predeterminado de infixl 9, por lo que será tratado como cualquier otro operador infijo con la misma fijeza.

+0

¿Por qué está predeterminado a infixl 9? ¿Hay alguna razón detrás de esta elección, o es arbitraria? – CMCDragonkai

+1

En cierto modo, es arbitrario, por supuesto. Pero dado que tenerlo 'infijo' no permite encadenar sin paréntesis, es más conveniente tener una dirección de asociatividad. La asociatividad a la derecha es más rara, por lo que 'infixl' es la opción" menos sorprendente ". El nivel de precedencia de 9 es el más cercano al prefijo de la aplicación de prefijo, por lo tanto, cambia lo menos en comparación con la aplicación de prefijo. No estaba allí cuando se decidió, pero creo que la idea es que 'infixl 9' se eligió con la expectativa de que sea más conveniente y cause menos sorpresas. –

+0

Ya veo, pero ¿qué pasa con cosas como '!!' y '$'. ¿Hay alguna razón para explicar por qué '!!' tiene una precedencia mayor que '$'? Solo trato de entender el razonamiento de todas las ubicaciones de los operadores en la tabla: https://www.haskell.org/onlinereport/decls.html#fixity – CMCDragonkai

Cuestiones relacionadas