Haskell Language
Deklaracje poprawności
Szukaj…
Składnia
- infix [liczba całkowita] ops
- infixl [liczba całkowita] ops
- 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
- zawija aplikacje funkcyjne w parens
- korzysta z wiążącego pierwszeństwa do zawijania grup terminów oddzielonych przez operatorów o tym samym priorytecie
- 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 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1 -
1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1)) -
(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` gynależ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ą jest9.
Przykładowe deklaracje
-
infixr 5 ++ -
infixl 4 <*>, <*, *>, <**> -
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR` -
infix 4 ==, /=, <, <=, >=, > -
infix ??