Suche…


Syntax

  1. Infix [Ganzzahl] Ops
  2. infixl [integer] ops
  3. 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

  1. umschließt Funktionsanwendungen in Parens
  2. verwendet verbindliche Vorrangstellung, um Gruppen von Begriffen einzubinden, die alle von Operatoren derselben Vorrangstellung getrennt werden
  3. 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. 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)))

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 wir infixl *!? ), ist der Standardwert 9 .

Beispieldeklarationen

  • 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow