Haskell Language
Declaraties van de betrouwbaarheid
Zoeken…
Syntaxis
- infix [geheel getal] ops
- infixl [geheel getal] ops
- 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
- wikkelt functietoepassingen in parens
- maakt gebruik van bindende prioriteit om groepen termen in te sluiten die allemaal worden gescheiden door operatoren met dezelfde prioriteit
- 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 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
-
1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
-
(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 standaardwaarde9
.
Voorbeeldverklaringen
-
infixr 5 ++
-
infixl 4 <*>, <*, *>, <**>
-
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
-
infix 4 ==, /=, <, <=, >=, >
-
infix ??