Ricerca…


introduzione

La sintassi della chiamata di funzione di Haskell, spiegata con i confronti con i linguaggi in stile C ove applicabile. Questo è rivolto a persone che vengono in Haskell da uno sfondo in lingue in stile C.

Osservazioni

In generale, la regola per convertire una chiamata di funzione stile C in Haskell, in qualsiasi contesto (assegnazione, ritorno o incorporato in un'altra chiamata), è quella di sostituire le virgole nell'elenco di argomenti in stile C con spazi bianchi e spostare l'apertura parentesi dalla chiamata in stile C per contenere il nome della funzione e i suoi parametri.

Se alcune espressioni sono racchiuse interamente tra parentesi, queste coppie (esterne) di parentesi possono essere rimosse per la leggibilità, in quanto non influenzano il significato dell'espressione.
Vi sono altre circostanze in cui è possibile rimuovere le parentesi, ma ciò influisce solo sulla leggibilità e sulla manutenibilità.

Parentesi in una chiamata di funzione di base

Per una chiamata di funzione in stile C, ad es

plus(a, b); // Parentheses surrounding only the arguments, comma separated

Quindi sarà il codice Haskell equivalente

(plus a b) -- Parentheses surrounding the function and the arguments, no commas

In Haskell, le parentesi non sono richieste esplicitamente per l'applicazione di funzione e sono usate solo per disambiguare le espressioni, come in matematica; quindi nei casi in cui le parentesi racchiudono tutto il testo nell'espressione, le parentesi non sono effettivamente necessarie, e il seguente è anche equivalente:

plus a b -- no parentheses are needed here!

È importante ricordare che, mentre ci si trova nei linguaggi in stile C, la funzione

Parentesi nelle chiamate di funzioni integrate

Nell'esempio precedente, non abbiamo finito per richiedere le parentesi, perché non influivano sul significato dell'istruzione. Tuttavia, sono spesso necessari nell'espressione più complessa, come quella qui sotto.
In C:

plus(a, take(b, c));

In Haskell questo diventa:

(plus a (take b c))
-- or equivalently, omitting the outermost parentheses
plus a (take b c)

Nota che questo non è equivalente a:

plus a take b c -- Not what we want!

Si potrebbe pensare che poiché il compilatore sa che take è una funzione, sarebbe in grado di sapere che si desidera applicarlo agli argomenti b e c e passare il risultato a plus .
Tuttavia, in Haskell, le funzioni assumono spesso altre funzioni come argomenti e viene fatta poca distinzione effettiva tra funzioni e altri valori; e così il compilatore non può assumere la tua intenzione semplicemente perché take è una funzione.

E così, l'ultimo esempio è analogo alla seguente chiamata di funzione C:

plus(a, take, b, c); // Not what we want!

Applicazione parziale - Parte 1

In Haskell, le funzioni possono essere parzialmente applicate; possiamo pensare a tutte le funzioni come prendere un singolo argomento e restituire una funzione modificata per la quale tale argomento è costante. Per illustrare questo, possiamo eseguire le funzioni di parentesi come segue:

(((plus) 1) 2)

Qui, la funzione (plus) viene applicata a 1 dando la funzione ((plus) 1) , che viene applicata a 2 , dando la funzione (((plus) 1) 2) . Perché plus 1 2 è una funzione che non accetta argomenti, puoi considerarla un valore normale; tuttavia, in Haskell, c'è poca distinzione tra funzioni e valori.

Per approfondire, la funzione plus è una funzione che aggiunge i suoi argomenti.
La funzione plus 1 è una funzione che aggiunge 1 al suo argomento.
La funzione plus 1 2 è una funzione che aggiunge 1 a 2 , che è sempre il valore 3 .

Applicazione parziale - Parte 2

Come altro esempio, abbiamo la map funzioni, che accetta una funzione e un elenco di valori e applica la funzione a ciascun valore della lista:

map :: (a -> b) -> [a] -> [b]

Diciamo che vogliamo incrementare ogni valore in una lista. Puoi decidere di definire la tua funzione, che aggiunge uno al suo argomento, e map quella funzione sul tuo elenco

addOne x = plus 1 x
map addOne [1,2,3]

ma se si ha un altro sguardo alla definizione di addOne , con le parentesi aggiunte per enfatizzare:

(addOne) x = ((plus) 1) x

La funzione addOne , quando applicata a qualsiasi valore x , è la stessa della funzione parzialmente applicata plus 1 applicata a x . Ciò significa che le funzioni addOne e plus 1 sono identiche e possiamo evitare di definire una nuova funzione semplicemente sostituendo addOne con plus 1 , ricordando di usare le parentesi per isolare plus 1 come sottoespressione:

map (plus 1) [1,2,3]


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