Haskell Language
Declaraciones de fijeza
Buscar..
Sintaxis
- infix [integer] ops
- infixl [integer] ops
- infixr [integer] ops
Parámetros
Componente de declaración | Sentido |
---|---|
infixr | el operador es asociativo por derecho |
infixl | el operador es asociativo a la izquierda |
infix | el operador no es asociativo |
dígito opcional | precedencia de enlace del operador (rango 0 ... 9, por defecto 9) |
op1, ... , opn | operadores |
Observaciones
Para analizar expresiones que involucran operadores y funciones, Haskell usa declaraciones de corrección para averiguar a dónde va el paréntesis. En orden,
- Envuelve aplicaciones de función en parens
- utiliza la prioridad de enlace para envolver grupos de términos separados por operadores de la misma precedencia
- usa la asociatividad de esos operadores para averiguar cómo agregar parens a estos grupos
Observe que asumimos aquí que los operadores en cualquier grupo dado del paso 2 deben tener todos la misma asociatividad. De hecho, Haskell rechazará cualquier programa donde esta condición no se cumpla.
Como ejemplo del algoritmo anterior, podemos pasar por el proceso de agregar paréntesis a 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1
.
infixl 6 +
infixl 6 -
infixl 7 *
infixr 8 ^
-
1 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
-
1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
-
(1 + ((negate 5) * 2)) - (3 * (4 ^ (2 ^ 1)))
Más detalles en la sección 4.4.2 del informe Haskell 98 .
Asociatividad
infixl
vs infixr
vs infix
describe en qué lados se agruparán los parens. Por ejemplo, considere las siguientes declaraciones de arreglo (en base)
infixl 6 -
infixr 5 :
infix 4 ==
El infixl
nos dice que -
ha dejado asociatividad, lo que significa que 1 - 2 - 3 - 4
se analiza como
((1 - 2) - 3) - 4
El infixr
nos dice que :
tiene asociatividad correcta, lo que significa que 1 : 2 : 3 : []
se analiza como
1 : (2 : (3 : []))
El infix
nos dice que ==
no se puede usar sin incluir paréntesis, lo que significa que True == False == True
es un error de sintaxis. Por otro lado, True == (False == True)
o (True == False) == True
están bien.
Los operadores sin una declaración de fijación explícita son infixl 9
.
Precedencia vinculante
El número que sigue a la información de asociatividad describe en qué orden se aplican los operadores. Siempre debe estar entre 0
y 9
inclusive. Esto se conoce comúnmente como la forma en que el operador se une. Por ejemplo, considere las siguientes declaraciones de arreglo (en base)
infixl 6 +
infixl 7 *
Como *
tiene una prioridad de enlace más alta que +
, leemos 1 * 2 + 3
como
(1 * 2) + 3
En resumen, cuanto más alto sea el número, más cerca estará el operador de "tirar" de los parens a cada lado.
Observaciones
La aplicación de la función siempre se enlaza más alto que los operadores, por lo que
fx `op` gy
debe interpretarse como(fx)
op(gy)
sin importar lo que el operador``op`
y su declaración de fijeza.Si se omite la prioridad de enlace en una declaración de
infixl *!?
(por ejemplo, ¡tenemosinfixl *!?
) el valor predeterminado es9
.
Declaraciones de ejemplo
-
infixr 5 ++
-
infixl 4 <*>, <*, *>, <**>
-
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
-
infix 4 ==, /=, <, <=, >=, >
-
infix ??