Szukaj…


Składnia

  1. infix [liczba całkowita] ops
  2. infixl [liczba całkowita] ops
  3. infixr [liczba całkowita] ops

Parametry

Składnik deklaracji Znaczenie
infixr operator jest prawostronny
infixl operator jest lewostronny
infix operator nie jest powiązany
opcjonalna cyfra wiążące pierwszeństwo operatora (zakres 0 ... 9, domyślnie 9)
op1, ... , opn operatorzy

Uwagi

Aby przeanalizować wyrażenia obejmujące operatory i funkcje, Haskell używa deklaracji poprawności, aby dowiedzieć się, gdzie idą nawiasy. W porządku, to

  1. zawija aplikacje funkcyjne w parens
  2. korzysta z wiążącego pierwszeństwa do zawijania grup terminów oddzielonych przez operatorów o tym samym priorytecie
  3. wykorzystuje skojarzenie tych operatorów, aby dowiedzieć się, jak dodać pareny do tych grup

Zauważ, że zakładamy tutaj, że operatorzy w dowolnej grupie z kroku 2 muszą mieć tę samą asocjatywność. W rzeczywistości Haskell odrzuci każdy program, w którym ten warunek nie jest spełniony.

Jako przykład powyższego algorytmu możemy przejść proces dodawania nawiasu do 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)))

Więcej szczegółów w sekcji 4.4.2 raportu Haskell 98 .

Stowarzyszenie

infixl vs infixr vs infix opisano na boki parens będą grupowane. Weźmy na przykład następujące deklaracje poprawności (w bazie)

infixl 6 -
infixr 5 :
infix  4 ==

infixl mówi nam, że - opuścił asocjatywność, co oznacza, że 1 - 2 - 3 - 4 jest analizowany jako

((1 - 2) - 3) - 4

infixr mówi nam, że : ma właściwe skojarzenie, co oznacza, że 1 : 2 : 3 : [] jest analizowany jako

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

infix informuje nas, że == nie można używać bez nas, w tym w nawiasach, co oznacza, że True == False == True to błąd składniowy. Z drugiej strony True == (False == True) lub (True == False) == True są w porządku.

Operatorzy nieposiadający wyraźnej deklaracji poprawności mają infixl 9 .

Wiążący priorytet

Liczba występująca po informacjach o powiązaniu opisuje, w jakiej kolejności są stosowane operatory. Musi zawsze zawierać się w przedziale od 0 do 9 włącznie. Jest to powszechnie określane jako ścisłe powiązanie operatora. Weźmy na przykład następujące deklaracje poprawności (w bazie)

infixl 6 +
infixl 7 *

Ponieważ * ma wyższy priorytet wiązania niż + , czytamy 1 * 2 + 3 jako

(1 * 2) + 3

Krótko mówiąc, im wyższa liczba, tym bliżej operator „pociągnie” pareny po obu jego stronach.

Uwagi

  • Aplikacja funkcji zawsze wiąże wyższą wartość niż operatory, więc fx `op` gy należy interpretować jako (fx) op (gy) bez względu na to, jaki operator` `op` i jego deklaracja poprawności są.

  • Jeśli pierwszeństwo wiązania zostanie pominięte w deklaracji poprawności (na przykład mamy infixl *!? ), wartością domyślną jest 9 .

Przykładowe deklaracje

  • 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow