Ricerca…


Sintassi

  1. infisso [intero] ops
  2. infixl [numero intero] ops
  3. 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,

  1. avvolge le applicazioni di funzione in parens
  2. utilizza la precondenza vincolante per raggruppare gruppi di termini tutti separati da operatori con la stessa precedenza
  3. 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. 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)))

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow