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` gydebe 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 ??