Haskell Language
Déclarations de fixité
Recherche…
Syntaxe
- infixe [entier] ops
- infixl [entier] ops
- 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
- encapsule des applications de fonction dans parens
- utilise la précaution de liaison pour envelopper des groupes de termes tous séparés par des opérateurs de même priorité
- 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 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
-
1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
-
(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 est9
.
Exemples de déclarations
-
infixr 5 ++
-
infixl 4 <*>, <*, *>, <**>
-
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
-
infix 4 ==, /=, <, <=, >=, >
-
infix ??