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` 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ą jest9
.
Przykładowe deklaracje
-
infixr 5 ++
-
infixl 4 <*>, <*, *>, <**>
-
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
-
infix 4 ==, /=, <, <=, >=, >
-
infix ??