Sto provando a verificare qualcosa sull'operatore e sulla precedenza delle funzioni in Haskell. Per esempio, il codice seguenteHaskell operatore vs funzione precedenza
list = map foo $ xs
può essere riscritta come
list = (map foo) $ (xs)
e alla fine sarà
list = map foo xs
La mia domanda di una volta, perché la prima formulazione non sarebbe essere riscritta come
list = (map foo $) xs
poiché la precedenza della funzione è sempre superiore alla precedenza dell'operatore, ma penso di aver trovato la risposta: gli operatori non possono semplicemente essere argomenti di funzioni (eccetto ovviamente, se li circondano con parentesi). È giusto? Se è così, trovo strano che non ci sia menzione di questa meccanica/regola in RWH o Learn you a Haskell, o in nessuno degli altri posti che ho cercato. Quindi, se conosci un luogo, dove viene dichiarata la regola, ti preghiamo di collegarti ad esso.
- modifica: Grazie per le risposte rapide. Penso che la mia confusione sia venuta dal pensare che un operatore letterale avrebbe in qualche modo valutato qualcosa, che potrebbe essere consumato da una funzione come argomento. Mi ha aiutato a ricordare che un operatore infisso può essere tradotto meccanicamente in funzioni prefissate. In questo modo le prime rese formulazione
($) (map foo) (xs)
in cui v'è alcun dubbio che ($) è la funzione che consumano, e dal momento che le due formulazioni sono equivalenti, quindi il $ letterale nella prima formulazione non può essere consumato da mappa.
Grazie. Dopo aver letto la tua risposta, quando dici che la mia domanda è un po 'confusa, prendo per capire che la mia menzione di "precedenza della funzione" è sbagliata, e che le funzioni in se stesse non hanno alcuna precedenza, ma piuttosto possono essere pensate come argomenti per l'operatore dell'applicazione, spazi bianchi. È corretto? Non sono ancora del tutto chiaro su come gli operatori di infix si adattano a questo. Ho modificato la mia domanda per riflettere su come posso pensarci meglio. Questa comprensione è corretta? – Boris
No, non proprio. Funzioni e operatori sono indistinguibili in Haskell. Possono entrambi avere diversi livelli di precedenza, specificati dall'utente. –
Ok. Sto ancora cercando di capire la regola generale, che porta a list = (map pippo) $ (xs) invece di list = (map pippo $) xs - che so essere una sezione. Si può dire che quando si decide, per una determinata espressione, quali argomenti appartengono a quali funzioni e operatori, le funzioni consumano - a partire da sinistra - tutti gli argomenti che possono, finché non raggiungono un operatore.Dopo questo, gli operatori utilizzano i loro argomenti, in base alla loro precedenza e associatività (questo è un po 'vago, ma spero che tu capisca). Scusa, se questo sembra ovvio, ma non è mai stato così chiaro per me. – Boris