Haskell Language
Dichiarazioni di fissità
Ricerca…
Sintassi
- infisso [intero] ops
- infixl [numero intero] ops
- infixr [intero] ops
Parametri
Componente della dichiarazione | Senso |
---|---|
infixr | l'operatore ha ragione-associativa |
infixl | l'operatore è associato a sinistra |
infix | l'operatore non è associativo |
cifra opzionale | precedenza di binding dell'operatore (range 0 ... 9, default 9) |
op1, ... , opn | operatori |
Osservazioni
Per analizzare le espressioni che coinvolgono operatori e funzioni, Haskell usa le dichiarazioni di fissità per capire dove andare la parentesi. In ordine,
- avvolge le applicazioni di funzione in parens
- utilizza la precondenza vincolante per raggruppare gruppi di termini tutti separati da operatori con la stessa precedenza
- usa l'associatività di quegli operatori per capire come aggiungere paren- ti a questi gruppi
Si noti che qui assumiamo che gli operatori di un determinato gruppo del passaggio 2 debbano tutti avere la stessa associatività. In effetti, Haskell rifiuterà qualsiasi programma in cui questa condizione non è soddisfatta.
Come esempio dell'algoritmo di cui sopra, possiamo passare attraverso il processo di aggiunta di parentesi a 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)))
Maggiori dettagli nella sezione 4.4.2 del report Haskell 98 .
Associatività
infixl
vs infixr
vs infix
descrive su quali lati verranno raggruppati i infixr
. Ad esempio, considerare le seguenti dichiarazioni di fissità (in base)
infixl 6 -
infixr 5 :
infix 4 ==
L' infixl
ci dice che -
ha lasciato l'associatività, il che significa che 1 - 2 - 3 - 4
viene analizzato come
((1 - 2) - 3) - 4
L' infixr
ci dice che :
ha associatività corretta, il che significa che 1 : 2 : 3 : []
viene analizzato come
1 : (2 : (3 : []))
L' infix
ci dice che ==
non può essere usato senza di noi inclusa la parentesi, il che significa che True == False == True
è un errore di sintassi. D'altra parte, True == (False == True)
o (True == False) == True
vanno bene.
Gli operatori senza una dichiarazione di fissità esplicita sono infixl 9
.
Precedenza vincolante
Il numero che segue le informazioni di associatività descrive in quale ordine vengono applicati gli operatori. Deve sempre essere compreso tra 0
e 9
inclusi. Questo è comunemente indicato come strettamente legato dall'operatore. Ad esempio, considerare le seguenti dichiarazioni di fissità (in base)
infixl 6 +
infixl 7 *
Poiché *
ha una precedenza di rilegatura superiore a +
leggiamo 1 * 2 + 3
come
(1 * 2) + 3
In breve, più alto è il numero, più vicino l'operatore "tira" i parents su entrambi i lati.
Osservazioni
L'applicazione della funzione si lega sempre più degli operatori, quindi
fx `op` gy
deve essere interpretato come(fx)
op(gy)
indipendentemente da cosa sia l'operatore``op`
e la sua dichiarazione di fissità.Se la precedenza del legame è omessa in una dichiarazione di fissità (ad esempio abbiamo
infixl *!?
) il valore predefinito è9
.
Dichiarazioni di esempio
-
infixr 5 ++
-
infixl 4 <*>, <*, *>, <**>
-
infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
-
infix 4 ==, /=, <, <=, >=, >
-
infix ??