Sök…


Syntax

  1. infix [heltal] ops
  2. infixl [heltal] ops
  3. 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

  1. lindar funktionsapplikationer i parens
  2. använder bindande företräde för att radera grupper av termer som alla separeras av operatörer med samma prioritet
  3. 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. 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)))

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 standarden 9 .

Exempeldeklarationer

  • 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow