Haskell Language
Rättighetsförklaringar
Sök…
Syntax
- infix [heltal] ops
- infixl [heltal] ops
- infixr [heltal] ops
parametrar
Deklarationskomponent | Menande |
---|---|
infixr | operatören är rätt associerande |
infixl | operatören är vänsterassocierande |
infix | operatören är icke-associerande |
valfri siffra | bindande företräde för operatören (intervall 0 ... 9, standard 9) |
op1, ... , opn | operatörer |
Anmärkningar
För att analysera uttryck som involverar operatörer och funktioner använder Haskell fixitetsdeklarationer för att ta reda på vart parentes går. I ordning, det
- lindar funktionsapplikationer i parens
- använder bindande företräde för att radera grupper av termer som alla separeras av operatörer med samma prioritet
- använder associativiteten för dessa operatörer för att ta reda på hur man lägger till föräldrar till dessa grupper
Lägg märke till att vi här antar att operatörerna i en viss grupp från steg 2 alla måste ha samma associativitet. I själva verket kommer Haskell att avvisa alla program där detta villkor inte är uppfyllda.
Som ett exempel på ovanstående algoritm kan vi stega om processen att lägga till parentes till 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)))
Mer information i avsnitt 4.4.2 i Haskell 98-rapporten .
associativitet
infixl
vs infixr
vs infix
beskriver på vilka sidor parens kommer att grupperas. Tänk till exempel på följande fastighetsdeklarationer (i bas)
infixl 6 -
infixr 5 :
infix 4 ==
infixl
berättar att -
har lämnat associativitet, vilket innebär att 1 - 2 - 3 - 4
blir analyserad som
((1 - 2) - 3) - 4
infixr
berättar att :
har rätt associativitet, vilket innebär att 1 : 2 : 3 : []
blir analyserad som
1 : (2 : (3 : []))
infix
berättar att ==
inte kan användas utan att vi inkluderar parentes, vilket innebär att True == False == True
är ett syntaxfel. Å andra sidan är True == (False == True)
eller (True == False) == True
är bra.
Operatörer som inte har en uttrycklig fixitetsdeklaration är infixl 9
.
Bindande företräde
Antalet som följer associativitetsinformationen beskriver i vilken ordning operatörerna tillämpar. Det måste alltid vara mellan 0
och 9
inklusive. Detta kallas ofta hur tätt operatören binds. Tänk till exempel på följande fastighetsdeklarationer (i bas)
infixl 6 +
infixl 7 *
Eftersom *
har en högre bindande företräde än +
läser vi 1 * 2 + 3
som
(1 * 2) + 3
Kort sagt, ju högre antal, desto närmare kommer operatören att "dra" parens på vardera sidan av den.
Anmärkningar
Funktionsapplikation binder alltid högre än operatörerna, så
fx `op` gy
måste tolkas som(fx)
op(gy)
oavsett vad operatören``op`
och dess fixitetsdeklaration är.Om bindande företräde utelämnas i en fixitetsdeklaration (till exempel har vi
infixl *!?
) är standarden9
.
Exempeldeklarationer
-
infixr 5 ++
-
infixl 4 <*>, <*, *>, <**>
-
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
-
infix 4 ==, /=, <, <=, >=, >
-
infix ??