Recherche…


Syntaxe

  1. infixe [entier] ops
  2. infixl [entier] ops
  3. infixr [entier] ops

Paramètres

Composant de déclaration Sens
infixr l'opérateur est associé à droite
infixl l'opérateur est associé à gauche
infix l'opérateur est non associatif
chiffre optionnel priorité de l'opérateur (plage 0 ... 9, valeur par défaut 9)
op1, ... , opn les opérateurs

Remarques

Pour analyser des expressions impliquant des opérateurs et des fonctions, Haskell utilise des déclarations de fixité pour déterminer où vont les parenthèses. Dans l'ordre, il

  1. encapsule des applications de fonction dans parens
  2. utilise la précaution de liaison pour envelopper des groupes de termes tous séparés par des opérateurs de même priorité
  3. utilise l'associativité de ces opérateurs pour déterminer comment ajouter des parens à ces groupes

Notez que nous supposons ici que les opérateurs d'un groupe donné de l'étape 2 doivent tous avoir la même associativité. En fait, Haskell rejettera tout programme où cette condition n'est pas remplie.

À titre d'exemple de l'algorithme ci-dessus, nous pouvons suivre le processus d'ajout de parenthèses à 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)))

Plus de détails dans la section 4.4.2 du rapport Haskell 98 .

Associativité

infixl vs infixr vs infix décrivent de quel côté les parens seront groupés. Par exemple, considérons les déclarations de fixité suivantes (en base)

infixl 6 -
infixr 5 :
infix  4 ==

L' infixl nous dit que - a quitté l'associativité, ce qui signifie que 1 - 2 - 3 - 4 est analysé comme

((1 - 2) - 3) - 4

L' infixr nous dit que : a l'associativité correcte, ce qui signifie que 1 : 2 : 3 : [] est analysé comme

1 : (2 : (3 : []))

L' infix nous dit que == ne peut être utilisé sans nous, y compris les parenthèses, ce qui signifie que True == False == True est une erreur de syntaxe. En revanche, True == (False == True) ou (True == False) == True va.

Les opérateurs sans déclaration de fixité explicite sont infixl 9 .

Priorité obligatoire

Le nombre qui suit les informations d'associativité décrit dans quel ordre les opérateurs sont appliqués. Il doit toujours être compris entre 0 et 9 inclus. C'est ce que l'on appelle communément le niveau de liaison de l'opérateur. Par exemple, considérons les déclarations de fixité suivantes (en base)

infixl 6 +
infixl 7 *

Puisque * a une préséance de liaison plus élevée que + nous lisons 1 * 2 + 3 comme

(1 * 2) + 3

En résumé, plus le nombre est élevé, plus l'opérateur se rapproche des parens.

Remarques

  • L'application de fonction se lie toujours plus haut que les opérateurs, donc fx `op` gy doit être interprété comme (fx) op (gy) peu importe ce que l'opérateur` `op` et sa déclaration de fixité sont.

  • Si la priorité de liaison est omise dans une déclaration de fixité (par exemple, nous avons infixl *!? ), la valeur par défaut est 9 .

Exemples de déclarations

  • 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow