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` gymå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 ??