Programmazione.it v6.2
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Chat Forum
Introduzione alla programmazione funzionale
Scritto da Fabrizio Pani il 25-05-2005 ore 02:57
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>.
Precedente: Windows Server 2003 R2
Successiva: La tecnologia Java raggiunge i dieci anni
Intervento di Tommaso Tagliapietra a.k.a. pluto del 25-05-2005 ore 10:00, Spinea (VE)
Nobile
Nobile
(55 interventi)
Iscritto il 21-07-2004
Generalmente si tende a pensare al linguaggio funzionale come un linguaggio interpretato e quindi decisamente piu' lento di un programma C o C++. C'e' da dire pero' che delle prime implementazioni del Lisp si sono fatti enormi progressi. Ora esistono compilatori Lisp che producono eseguibili con prestazioni quasi alla pari del C ed in alcuni casi anche migliori.
Intervento di Luca Torella a.k.a. taurus85 del 25-05-2005 ore 13:56, Buttrio (UD)
Plebeo
Plebeo
(24 interventi)
Iscritto il 23-11-2001
C'è anche da dire che grazie ai linguaggi funzionali è possibile fare cose che i linguaggi imperativi non possono proprio fare.
Intervento di Tommaso Tagliapietra a.k.a. pluto del 26-05-2005 ore 14:41, Spinea (VE)
Nobile
Nobile
(55 interventi)
Iscritto il 21-07-2004
su questo c'avrei qualcosa da ridire perché se potenzialmente con un linguaggio imperativo riesci a implementare un linguaggio funzionale ... dovrebbe essere anche vero che quello che riesci a fare con un linguaggio funzionale si riesce a fare anche con quello imperativo. La differenza è il come.
Copyright Programmazione.it™ 1999-2009. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 1.415 secondi. Sito ottimizzato per Mozilla Firefox. Powered by Kyron.