La programmazione funzionale è un paradigma di programmazione in cui la base del calcolo è la valutazione delle espressioni. Alcune caratteristiche sono l’uso di funzioni di ordine superiore, trasparenza referenziale e valutazione pigra. I vantaggi dello stile di programmazione includono che i programmi sono facili da leggere, sono molto affidabili e possono essere suddivisi in componenti. Gli svantaggi sono che i calcoli possono essere lenti e lo stile e la sintassi sono completamente diversi da altri stili di programmazione comuni. Lo stile di programmazione funzionale è più spesso adottato dagli accademici che dai professionisti dell’informatica.
Come suggerisce il nome, le funzioni sono una parte fondamentale di questo paradigma di programmazione. Le funzioni possono essere nidificate all’interno di altre funzioni, chiamate funzioni di ordine superiore, e ciascuna funzione di ordine superiore può essere suddivisa in funzioni di blocchi predefiniti facili da comprendere e da correggere. Esempi di alcune funzioni di ordine superiore sono Map e Nest. La funzione Map prende una funzione F e la lista di variabili, per esempio (x, y, z) e fornisce il risultato in una lista: Map [F, (x, y, z)] = (F(x), F (y), F(z)). Nest prende la funzione F, la variabile x e il numero di iterazioni: Nest[ F, x, 3] = F(F(F(x))).
La pura programmazione funzionale prende un input e restituisce un output senza mai cambiare lo stato di una variabile. In altre parole, una funzione con lo stesso input darà sempre gli stessi risultati indipendentemente da quanto accaduto in precedenza nel programma. Questa si chiama trasparenza referenziale. Poiché le funzioni matematiche sono trasparenti in modo referenziale, la programmazione funzionale è intuitiva per molti matematici, ingegneri e scienziati.
La trasparenza referenziale delle funzioni significa che l’ordine di valutazione della funzione non è importante. Pertanto le funzioni non devono essere valutate fino a quando non sono necessari i loro risultati, il che è chiamato valutazione pigra. Questo è in completo contrasto con la programmazione imperativa, dove un programma inizia con il primo comando e scorre attraverso l’elenco fino all’ultimo comando. La valutazione pigra salta le parti del programma che non seguono logicamente o sono superflue, il che ottimizza automaticamente il programma e può ridurre il tempo di calcolo.
La programmazione funzionale ha molti vantaggi rispetto ad altri paradigmi di programmazione. Le funzioni con input e output chiari sono facili da leggere e comprendere. Una volta che una funzione è stata accuratamente sottoposta a debug, può essere utilizzata in modo affidabile in altre applicazioni. Le macchine multicore possono essere in grado di calcolare funzioni che vengono valutate in modo indipendente in parallelo, migliorando drasticamente le prestazioni dei programmi.
Sfortunatamente, non tutti i programmi si prestano al calcolo parallelo e il calcolo dei programmi funzionali può essere piuttosto lento. I programmi funzionali fanno molto affidamento sulla ricorsione, che spesso è meno efficiente rispetto all’utilizzo di cicli tradizionali o metodi di iterazione. In effetti, la programmazione funzionale può essere piuttosto goffa e difficile da imparare poiché non assomiglia ad altri paradigmi più comuni come la programmazione orientata agli oggetti.
Gli accademici tendono a favorire la programmazione funzionale poiché fornisce un modo chiaro e comprensibile per programmare problemi complessi del mondo reale. Alcune lingue pure sono Haskell ed Erlang. Mathematica è specializzato in matematica simbolica, R è specializzato in statistica e J è specializzato in analisi finanziaria. I linguaggi multiparadigma come Scala e F# supportano sia la programmazione funzionale che altri stili di programmazione.