Introduzione alla programmazione funzionale

Riparti da zero

L’approccio alla programmazione funzionale può essere inizialmente molto faticoso.
Il problema principale è legato al fatto che solitamente non è il primo tipo di linguaggio che si studia, e gli utenti cercano di ricondurre le nuove nozioni alle tecniche di programmazione che conoscono. Tendenzialmente questa non è una buonissima idea, un po’ come se per imparare ad andare in biciclette si cercasse di associare la pedalata alla camminata o alla corsa.
Si tratta si sempre di due metodi per deambulare, ma la pratica è molto diversa. Andando in bici bisogna usare le mani per regolare la direzione ed effettuare un movimento rotatorio con le game per andare avanti, molto poco in comune con la camminata.
Lo stesso vale per la programmazione funzionale. Questo perché il programmatore medio che ci si approccia non è al suo primo cambio di linguaggio. Imparare il primo linguaggio di programmazione è inizialmente dura, bisogno imparare a ragionare per algoritmi, a suddividere i problemi complessi in una composizione di problemi più semplici.
Quando però si passa ad apprendere un altro linguaggio il tutto è molto più semplice. Un po’ come quando si impara a guidare e in seguito si cambia automobile, è necessario del tempo per regolarsi, capire quale leva attiva i tergicristalli e quale i fari, ma dopo un poco di adattamento si può continuare ad applicare la propria forma mentis in modo sostanzialmente invariato.

La cosa importante quando ci si approccia alla programmazione funzionale è partire dal presupposto che sia necessario ripartire da zero.
Bisogna imparare a pensare, a risolvere i nostri puzzles, in modo diverso.

Ma cos’è la programmazione funzionale?

Wikipedia definisce la programmazione funzionale così:
In informatica la programmazione funzionale è un paradigma di programmazione in cui il flusso di esecuzione del programma assume la forma di una serie di valutazioni di funzioni matematiche. Il punto di forza principale di questo paradigma è la mancanza di effetti collaterali (side-effect) delle funzioni, il che comporta una più facile verifica della correttezza e della mancanza di bug del programma e la possibilità di una maggiore ottimizzazione dello stesso. Un uso particolare del paradigma, per l’ottimizzazione dei programmi, è quello di trasformare gli stessi per utilizzarli nella programmazione parallela.

La programmazione funzionale pone maggior accento sulla definizione di funzioni, rispetto ai paradigmi procedurali e imperativi, che invece prediligono la specifica di una sequenza di comandi da eseguire. In questi ultimi, i valori vengono calcolati cambiando lo stato del programma attraverso delle assegnazioni; un programma funzionale, invece, è immutabile: i valori non vengono trovati cambiando lo stato del programma, ma costruendo nuovi stati a partire dai precedenti.

Cerchiamo di fare un po’ di chiarezza, o meglio, poniamo l’accento su ciò che in questa definizione è realmente importante. Tutte le guide, i libri e i tutorial che trattano un’introduzione alla programmazione funzionale iniziano elencando, e spiegando, i principali paradigmi del linguaggio.
Ovviamente questo è un passaggio importante e ci arriveremo anche in questa guida, ma trovo che ci sia un paradigma, o meglio una caratteristica strutturale dei linguaggi funzionali che di fatto è la radice da cui germogliano gli altri paradigmi che caratterizzano il linguaggio.

La programmazione funzionale non ha side-effects
Anche se molti di voi sanno già benissimo di cosa parlo, ad alcuni il termine potrebbe risultare sconosciuto, trovo quindi importante fare un piccolo approfondimento per chiarire di cosa parliamo.
In informatica si dice che una funzione (o un metodo) produce un effetto collaterale quando modifica un valore o uno stato al di fuori del proprio scope.
Una funziona senza side-effect si limita a ricevere dei parametri in input e restituire uno o più valori in output. Questo significa che non modifica il valore di variabili globali o statiche, e che i parametri sono passati per valore e non per referenza. Vale a dire che la funzione lavora sui valori delle variabili che vengono passate senza modificare i valori all’interno delle variabili stesse.

Manca tutto

Nella programmazione funzionale non sono presenti le variabili, non in senso stretto quantomeno. Rimane possibile associare un valore ad un nome, ma non è possibile successivamente modificare questo nome.

x = 2
x = 3

Questo non è un comando lecito nei linguaggi funzionali, anche perché siete forse dei bugiardi? avete appena detto che x è 2 e poi mi dite che x è 3? Mmmm… non me la raccontate giusta voi.
Per abitudine all’interno del paradigma funzionale vengono comunque chiamate variabili quelle che in realtà sono delle costanti.

Non sono inoltre presenti i nostri cari e amati loop, non si possono usare né while for. L’unico modo per creare un loop è usare la ricorsione.

Lo so, siete sconcertati. Vi starete domandando “come cavolo faccio a scrivere un programma senza variabili né cicli?” . Ciò che troverete sorprendente mentre diventate via via più familiari con il paradigma funzionale, è che in realtà non vi servono a nulla. Anzi, sono più spesso fonte di errori e imprecisioni che veramente utili.

Come vedremo nel prossimo articolo, nel quale esamineremo tutte le pietre angolari del paradigma funzionale, è che tutte le limitazioni, all’apparenza insormontabili e che sembrano rendere estremamente esoterica e complessa questa tecnica di programmazione, in realtà rendono i software scritti con questi linguaggi più robusti, semplici, leggibili e manutenibili. Inoltre sono molto più performanti.

Articolo Successivo

Tutorial programmazione C – Operatori

Buongiorno a tutti,

in questo terzo episodio del tutorial sulla programmazione in C introduciamo gli operatori matematici, la funzione scanf e realizziamo una prima versione di calcolatrice.

(altro…)