La programmazione funzionale è uno stile di programmazione al pari dei più noti paradigmi di linguaggi imperativi, procedurali (strutturati), orientati agli oggetti e dichiarativi, che non si basa su comandi da eseguire sequenzialmente e/o in un certo ordine, ma sui risultati di espressioni matematiche, cioè su funzioni.
Una funzione ha come input un certo numero di argomenti, che possono essere anche altre funzioni, come nell'espressione <strong>f(x)=x<sup>2</sup> + 2</strong>, in cui la funzione <strong>f(x)</strong>, ha come argomenti la funzione <strong>x<sup>2</sup></strong> e <strong>x</strong>, e in questo caso f(x) è una funzione cosiddetta di tipo <strong>higher-order</strong>.
Una funzione può restituire anche una funzione, non solo un valore, ed eventualmente una funzione presente come argomento può richiamare un'altra funzione che a sua volta ne chiama un'altra, fino a quando si arriva ad un tipo di base implementato nel linguaggio. C'è da dire inoltre che nella programmazione funzionale non è importante l'ordine di esecuzione dei membri di un'espressione che possono essere valutati in qualsiasi ordine: abbiamo cioè una relazione tra dei dati che devono essere calcolati, ma non è importante sapere come saranno calcolati.
Un'altra caratteristica propria della programmazione funzionale è che sulle funzioni può essere applicata la tecnica chiamata <strong>currying</strong>: essa consiste nel trasformare una funzione che prende più di un argomento in un singolo argomento (il primo della funzione originale), che invece di ritornare un valore restituisce una funzione. Questa funzione prende poi i restanti argomenti e infine restituisce un valore.
In questo paradigma non esiste un esplicito assegnamento di variabile in un'esplicita allocazione di memoria; questo avviene in maniera trasparente e, per quanto riguarda la memoria, tramite un meccanismo di <strong>garbage collection</strong>. Per sicurezza è inoltre implementato un meccanismo di controllo sui limiti di un array, o brevemente <strong>bounds checking</strong>, quindi non sono presenti i noti <strong>effetti collaterali</strong> (side-effects) propri di linguaggi a basso livello, come per esempio un errore di tipo <em>off by one</em> del linguaggio C.
I linguaggi funzionali si possono dividere in <strong>puri </strong>e <strong>non puri</strong>, e nel primo caso sono ammesse solo caratteristiche proprie di un linguaggio funzionale. Più che altro la distinzione è tra un linguaggio cosiddetto <strong>strict</strong> e uno di tipo <strong>lazy</strong>. Dell'ultimo tipo fa parte per esempio il linguaggio Haskell, in quanto i dati sono valutati, calcolati, quanto basta per ottenere il risultato voluto e in modo da garantire la modularità.
In un linguaggio funzionale il codice è più conciso specialmente laddove si devono implementare degli algoritmi di ordinamento, e queste viene fatto in maniera ricorsiva piuttosto che iterativa. D'altro canto la velocità è in genere inferiore rispetto a linguaggi come il C e il C++.
Il <strong>calcolo Lambda</strong> (<strong>lambda calculus</strong>) di <strong>Alonzo Church</strong> è il primo esempio di linguaggio funzionale anche se non implementato in un computer, e si deve aspettare all'incirca fino al 1956 con <strong>IPL</strong> (Information Processing Language). Il linguaggio più noto è però senz'altro <strong>Lisp</strong>, il successore. Altri noti linguaggi funzionali sono <strong>Erlang</strong>, <strong>Scheme</strong>, <strong>Clean</strong>, e <strong>Caml</strong>.
Linguaggi come il Python permettono un approccio funzionale alla programmazione, nello specifico tramite le funzioni <strong>map</strong>, <strong>filter</strong>, e <strong>reduce</strong>, e il costrutto <strong>lambda</strong>.
Fonti: <a target="_blank" href="http://en.wikipedia.org/wiki/Functional_programming">Wikipedia</a>, <a target="_blank" href="http://www.haskell.org/aboutHaskell.html">Haskell</a>.