Buscar..


Sintaxis

  1. infix [integer] ops
  2. infixl [integer] ops
  3. 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,

  1. Envuelve aplicaciones de función en parens
  2. utiliza la prioridad de enlace para envolver grupos de términos separados por operadores de la misma precedencia
  3. 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. 1 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
  2. 1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
  3. (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, ¡tenemos infixl *!? ) el valor predeterminado es 9 .

Declaraciones de ejemplo

  • infixr 5 ++
  • infixl 4 <*>, <*, *>, <**>
  • infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
  • infix 4 ==, /=, <, <=, >=, >
  • infix ??


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow