Haskell Language
Festigkeitserklärungen
Suche…
Syntax
- Infix [Ganzzahl] Ops
- infixl [integer] ops
- infixr [integer] ops
Parameter
Deklarationskomponente | Bedeutung |
---|---|
infixr | Der Operator ist rechtsassoziativ |
infixl | Der Operator ist linksassoziativ |
infix | Der Operator ist nicht assoziativ |
optionale Ziffer | Bindungsrang des Operators (Bereich 0 ... 9, Standard 9) |
op1, ... , opn | Betreiber |
Bemerkungen
Um Ausdrücke mit Operatoren und Funktionen zu analysieren, verwendet Haskell Fixitätsdeklarationen, um herauszufinden, wo sich Klammern befinden. In Ordnung, es
- umschließt Funktionsanwendungen in Parens
- verwendet verbindliche Vorrangstellung, um Gruppen von Begriffen einzubinden, die alle von Operatoren derselben Vorrangstellung getrennt werden
- verwendet die Assoziativität dieser Operatoren, um herauszufinden, wie diesen Gruppen Parens hinzugefügt werden können
Beachten Sie, dass wir hier davon ausgehen, dass die Operatoren in einer bestimmten Gruppe aus Schritt 2 alle die gleiche Assoziativität haben müssen. Tatsächlich lehnt Haskell jedes Programm ab, bei dem diese Bedingung nicht erfüllt ist.
Als Beispiel für den obigen Algorithmus können wir den Vorgang des Hinzufügens von Klammern zu 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1
schrittweise durchlaufen.
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)))
Weitere Einzelheiten finden Sie in Abschnitt 4.4.2 des Haskell 98-Berichts .
Assoziativität
infixl
vs infixr
vs infix
beschreibt, auf welchen Seiten die Parens gruppiert werden. Betrachten Sie zum Beispiel die folgenden Fixitätsdeklarationen (in der Basis)
infixl 6 -
infixr 5 :
infix 4 ==
Das infixl
sagt uns, dass -
die Assoziativität verlassen hat, was bedeutet, dass 1 - 2 - 3 - 4
als analysiert wird
((1 - 2) - 3) - 4
Das infixr
sagt uns, dass :
die richtige Assoziativität hat, was bedeutet, dass 1 : 2 : 3 : []
als analysiert wird
1 : (2 : (3 : []))
Das infix
sagt uns, dass ==
nicht ohne Klammern verwendet werden kann, was bedeutet, dass True == False == True
ein Syntaxfehler ist. Andererseits sind True == (False == True)
oder (True == False) == True
in Ordnung.
Operatoren ohne explizite Festigkeitsdeklaration sind infixl 9
.
Verbindliche Vorrangstellung
Die Zahl, die auf die Assoziativitätsinformationen folgt, beschreibt, in welcher Reihenfolge die Operatoren angewendet werden. Es muss immer zwischen 0
und 9
. Dies wird allgemein als die Bindung des Operators bezeichnet. Betrachten Sie zum Beispiel die folgenden Fixitätsdeklarationen (in der Basis)
infixl 6 +
infixl 7 *
Da *
eine höhere Bindungspriorität als +
, lesen wir 1 * 2 + 3
als
(1 * 2) + 3
Kurz gesagt, je höher die Zahl ist, desto näher wird der Bediener die Parens auf beiden Seiten "ziehen".
Bemerkungen
Die Funktionsanwendung bindet immer höher als Operatoren.
fx `op` gy
muss(fx)
op'(gy)
als(fx)
op(gy)
interpretiert werden, unabhängig davon, was der Operator`op`
und seine Festlegungsdeklaration sind.Wenn der Bindungsrang in einer
infixl *!?
weggelassen wird (z. B. haben wirinfixl *!?
), ist der Standardwert9
.
Beispieldeklarationen
-
infixr 5 ++
-
infixl 4 <*>, <*, *>, <**>
-
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
-
infix 4 ==, /=, <, <=, >=, >
-
infix ??