Programmazione puramente funzionale - Purely functional programming
In informatica , la programmazione puramente funzionale di solito designa un paradigma di programmazione - uno stile di costruzione della struttura e degli elementi dei programmi per computer - che tratta tutti i calcoli come valutazione di funzioni matematiche . La programmazione puramente funzionale può anche essere definita vietando cambiamenti di stato e dati mutevoli .
La programmazione puramente funzionale consiste nel garantire che le funzioni, all'interno del paradigma funzionale , dipendano solo dai loro argomenti, indipendentemente da qualsiasi stato globale o locale.
Differenza tra programmazione funzionale pura e impura
L'esatta differenza tra programmazione funzionale pura e impura è oggetto di controversia.
Di solito si dice che un programma è funzionale quando utilizza alcuni concetti di programmazione funzionale , come funzioni di prima classe e funzioni di ordine superiore . Tuttavia, una funzione di prima classe non deve essere puramente funzionale, poiché può utilizzare tecniche del paradigma imperativo , come array o metodi di input/output che non sono programmi puramente funzionali. In effetti, i primi linguaggi di programmazione citati come funzionali, IPL e Lisp , erano entrambi linguaggi funzionali "impuri" secondo la definizione corrente.
Le strutture dati puramente funzionali sono persistenti . La persistenza è richiesta per la programmazione funzionale; senza di essa, lo stesso calcolo potrebbe restituire risultati diversi. La programmazione funzionale può utilizzare strutture dati persistenti non puramente funzionali , mentre tali strutture dati non possono essere utilizzate in programmi puramente funzionali.
Proprietà della programmazione puramente funzionale
Valutazione rigorosa contro valutazione non rigorosa
Ogni strategia di valutazione che termina su un programma puramente funzionale restituisce lo stesso risultato. In particolare, assicura che il programmatore non debba considerare in quale ordine vengono valutati i programmi, poiché la valutazione desiderosa restituirà lo stesso risultato della valutazione pigra . Tuttavia, è ancora possibile che una valutazione ansiosa non termini mentre la valutazione pigra dello stesso programma si interrompe. Un vantaggio di questo è che la valutazione pigra può essere implementata molto più facilmente; poiché tutte le espressioni restituiranno lo stesso risultato in qualsiasi momento (indipendentemente dallo stato del programma), la loro valutazione può essere ritardata quanto necessario.
Calcolo parallelo
La programmazione puramente funzionale semplifica il calcolo parallelo poiché due parti puramente funzionali della valutazione non interagiscono mai.
Strutture dati
Le strutture di dati puramente funzionali sono spesso rappresentate in modo diverso rispetto alle loro controparti imperative . Ad esempio, l' array con accesso e aggiornamento a tempo costante è un componente di base della maggior parte dei linguaggi imperativi e molte strutture di dati imperativi, come la tabella hash e l' heap binario , sono basate su array. Gli array possono essere sostituiti da map o random access list , che ammette un'implementazione puramente funzionale, ma il tempo di accesso e aggiornamento è logaritmico . Pertanto, strutture di dati puramente funzionali possono essere utilizzate in linguaggi non funzionali, ma potrebbero non essere lo strumento più efficiente disponibile, soprattutto se non è richiesta la persistenza.
In generale, la conversione di un programma imperativo in uno puramente funzionale richiede anche di assicurarsi che le strutture precedentemente mutabili vengano ora esplicitamente restituite dalle funzioni che le aggiornano, una struttura di programma chiamata store-passing style .
Linguaggio puramente funzionale
Un linguaggio puramente funzionale è un linguaggio che ammette solo una programmazione puramente funzionale. I programmi puramente funzionali possono tuttavia essere scritti in linguaggi che non sono puramente funzionali.