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` gydeve 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 ??