Ich spiele mit den Deklarationen infixr
, infixl
und infix
. Ich verstehe, wie infixr
und infixl
funktioniert:
Aber ich verstehe nicht, wie das Schlüsselwort infix
funktioniert. Habe ich Recht damit, dass Sie mit infix
immer die Reihenfolge in Klammern angeben müssen? Wenn ja, warum ist das numerische Argument notwendig, wenn man berücksichtigt, dass Klammern die höchste Priorität haben?
r
und l
beziehen sich auf die Assoziativität, die angegebene Zahl bezieht sich auf die Rangfolge des Operators. Wenn Sie die Assoziativität nicht angeben, erhalten Sie einen Operator, der nur durch explizite Klammern verknüpft werden kann oder wenn die Assoziativität nicht eindeutig ist.
Verwenden wir eine Datenstruktur, um Operatoren zu definieren und zu verstehen, wie Assoziativität funktioniert:
%Vor%Es enthält die Zeichenfolge, die mit den folgenden Operatoren erstellt wurde.
infixr
und infixl
Definieren wir nun rechts- und linksassoziative Operatoren:
%Vor%Dieser Operator wird die Zeichenfolge des resultierenden Operators konstruieren, indem er den zugehörigen Termen explizit die Klammern hinzufügt.
Wenn wir es testen, sehen wir, dass es richtig funktioniert:
%Vor%infix
Eine infix
-Deklaration spezifiziert keine Assoziativität. Was sollte in diesen Fällen passieren? Mal sehen:
Und dann versuchen wir es:
%Vor%Woops, wir bekommen:
Precedence Parsing Fehler kann
?:' [infix 6] and
?: '[infix 6] im selben Infix-Ausdruck nicht mischen
Wie Sie sehen, hat der Sprachparser bemerkt, dass wir die Assoziativität des Operators nicht angegeben haben und nicht wissen, was zu tun ist.
Wenn wir stattdessen den letzten Begriff entfernen:
%Vor%Dann beschwert sich der Compiler nicht.
Um den ursprünglichen Ausdruck zu korrigieren, müssten wir explizit Klammern hinzufügen; zum Beispiel:
%Vor%Tags und Links haskell infix-notation