2011-11-15 20 views
23

Let f x y = x * y. Possiamo applicare questa funzione in due modi: f 5 6 o, utilizzando la notazione infisso, 5 `f` 6. Le regole dell'operatore si applicano a quest'ultima espressione? Quale precedenza avrà questa applicazione? È solo un'altra forma di applicazione di funzione, e quindi avrà anche la precedenza più alta?Haskell funzione infisso precedenza applicazione

Suppongo che il compilatore visualizzi questo modulo speciale (a causa di `` e/o il nome che inizia con una lettera (?)), E in realtà lo tratta come applicazione di funzione ordinaria, invece di considerarlo un operatore.

+2

La sintassi Haskell 98 consente di scegliere il livello di precedenza, vedi http://www.haskell.org/onlinereport/decls.html#fixity per i dettagli. –

+0

Grazie a Atal S-Z per le modifiche! – demi

risposta

22

Il Haskell 98 Report ha una sezione sulla Operator Applications che libera in su:

Un operatore è sia un simbolo dell'operatore, come ad esempio + o $$, o è un identificatore ordinario racchiuso in accenti gravi (apici) , ad esempio `op`. Ad esempio, invece di scrivere l'applicazione prefisso op xy, si può scrivere l'applicazione infisso x `op` y. Se non è stata fornita la dichiarazione di fissità per `op`, il valore predefinito è la precedenza più alta e lascia l'associatività (vedere la Sezione 4.4.2).

Come indicato dalle altre risposte, il Rapporto ha anche una sezione sulla Fixity Declarations che consente di definire la propria fissità, ad esempio:

infixl 7 `op` 
9

Se non viene fornita alcuna dichiarazione di fissità esplicita, come ad es.

infixl 7 `quot` 

una funzione infisso backticked ha la fissità predefinito infixl 9, così sarà trattato come qualsiasi altro operatore infisso con la stessa fissità.

+0

Perché è impostato su infixl 9? C'è qualche ragione dietro questa scelta, o è arbitraria? – CMCDragonkai

+1

In un certo senso, è arbitrario, ovviamente. Ma dal momento che avere 'infix' non consente il concatenamento senza parentesi, è più conveniente avere una direzione di associatività. L'associatività a destra è più rara, quindi 'infixl' è la scelta" meno sorprendente ". Il livello di precedenza di 9 è il più vicino al prefisso della precedenza dell'applicazione, quindi cambia il meno rispetto al prefisso dell'applicazione. Non ero lì quando è stato deciso, ma penso che l'idea è che "infixl 9" è stato scelto con l'aspettativa che è più conveniente e causa meno sorpresa. –

+0

Vedo, ma per quanto riguarda cose come '!!' e '$'. C'è qualche ragione per cui '!!' ha una precedenza più alta di '$'? Sto solo cercando di capire il ragionamento per tutti i posizionamenti degli operatori nella tabella: https://www.haskell.org/onlinereport/decls.html#fixity – CMCDragonkai