Zoeken…


Syntaxis

  1. infix [geheel getal] ops
  2. infixl [geheel getal] ops
  3. infixr [geheel getal] ops

parameters

Aangiftecomponent Betekenis
infixr de operator is recht-associatief
infixl de operator is links-associatief
infix de operator is niet-associatief
optioneel cijfer bindende prioriteit van de operator (bereik 0 ... 9, standaard 9)
op1, ... , opn operators

Opmerkingen

Haskell gebruikt expressies met operatoren en functies om vast te stellen waar haakjes heen gaan. Om het te doen

  1. wikkelt functietoepassingen in parens
  2. maakt gebruik van bindende prioriteit om groepen termen in te sluiten die allemaal worden gescheiden door operatoren met dezelfde prioriteit
  3. gebruikt de associativiteit van die operatoren om erachter te komen hoe parens aan deze groepen kunnen worden toegevoegd

Merk op dat we hier veronderstellen dat de operatoren in een bepaalde groep uit stap 2 allemaal dezelfde associativiteit moeten hebben. Haskell zal zelfs elk programma weigeren als niet aan deze voorwaarde is voldaan.

Als een voorbeeld van het bovenstaande algoritme kunnen we stappen zetten door het proces van het toevoegen van haakjes aan 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)))

Meer details in paragraaf 4.4.2 van het Haskell 98-rapport .

associativiteit

infixl vs infixr vs infix beschrijven aan welke zijden de parens worden gegroepeerd. Overweeg bijvoorbeeld de volgende fixiteitsverklaringen (in basis)

infixl 6 -
infixr 5 :
infix  4 ==

De infixl vertelt ons dat - associativiteit heeft verlaten, wat betekent dat 1 - 2 - 3 - 4 wordt ontleed als

((1 - 2) - 3) - 4

De infixr vertelt ons dat : juiste associativiteit heeft, wat betekent dat 1 : 2 : 3 : [] wordt ontleed als

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

De infix vertelt ons dat == niet kan worden gebruikt zonder ons, inclusief haakjes, wat betekent dat True == False == True een syntaxisfout is. Aan de andere kant, True == (False == True) of (True == False) == True zijn prima.

Operators zonder expliciete infixl 9 zijn infixl 9 .

Bindende voorrang

Het nummer dat volgt op de associativiteitsinformatie beschrijft in welke volgorde de operatoren worden toegepast. Het moet altijd tussen 0 en 9 . Dit wordt gewoonlijk aangeduid als hoe strak de operator bindt. Overweeg bijvoorbeeld de volgende fixiteitsverklaringen (in basis)

infixl 6 +
infixl 7 *

Omdat * een hogere bindende prioriteit heeft dan + , lezen we 1 * 2 + 3 als

(1 * 2) + 3

Kortom, hoe hoger het nummer, hoe dichter de operator de parens aan beide kanten zal "trekken".

Opmerkingen

  • Functietoepassing bindt altijd hoger dan operators, dus fx `op` gy moet worden geïnterpreteerd als (fx) op (gy) ongeacht wat de operator` `op` en de verklaring van vastheid zijn.

  • Als de bindende prioriteit wordt weggelaten in een fixiteitsverklaring (we hebben bijvoorbeeld infixl *!? ), is de standaardwaarde 9 .

Voorbeeldverklaringen

  • 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow