Molti linguaggi di programmazione moderni supportano un concetto di chiusura , cioè di un pezzo di codice (un blocco o una funzione) che
- Può essere trattato come un valore, e quindi memorizzato in una variabile, passato a diverse parti del codice, può essere definito in una parte di un programma e invocato in una parte totalmente diversa dello stesso programma.
- Può acquisire variabili dal contesto in cui è definito e accedervi quando viene successivamente richiamato (possibilmente in un contesto totalmente diverso).
Ecco un esempio di una chiusura scritta in Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
La funzione letterale x => x >= lowerBound
contiene la variabile libera lowerBound
, che è chiusa (vincolata) dall'argomento della funzione filterList
che ha lo stesso nome. La chiusura viene passata al metodo library filter
, che può invocarlo ripetutamente come una normale funzione.
Ho letto molte domande e risposte su questo sito e, per quanto ho capito, il termine chiusura è spesso associato automaticamente alla programmazione funzionale e allo stile di programmazione funzionale.
La definizione di programmazione delle funzioni su Wikipedia recita:
Nell'informatica, la programmazione funzionale è un paradigma di programmazione che considera il calcolo come la valutazione di funzioni matematiche ed evita dati di stato e mutabili. Sottolinea l'applicazione di funzioni, in contrasto con lo stile di programmazione imperativo, che enfatizza i cambiamenti di stato.
e più avanti
[...] nel codice funzionale, il valore di output di una funzione dipende solo dagli argomenti immessi nella funzione [...]. L'eliminazione degli effetti collaterali può rendere molto più semplice la comprensione e la previsione del comportamento di un programma, che è una delle motivazioni chiave per lo sviluppo della programmazione funzionale.
D'altra parte, molti costrutti di chiusura forniti dai linguaggi di programmazione consentono a una chiusura di acquisire variabili non locali e di modificarle quando viene invocata la chiusura, producendo così un effetto collaterale sull'ambiente in cui sono state definite.
In questo caso, le chiusure implementano la prima idea di programmazione funzionale (le funzioni sono entità di prima classe che possono essere spostate come altri valori) ma trascurano la seconda idea (evitando effetti collaterali).
Questo uso di chiusure con effetti collaterali è considerato stile funzionale o le chiusure sono considerate un costrutto più generale che può essere utilizzato sia per uno stile di programmazione funzionale che non funzionale? C'è della letteratura su questo argomento?
NOTA IMPORTANTE
Non metto in dubbio l'utilità degli effetti collaterali o di avere chiusure con effetti collaterali. Inoltre, non sono interessato a una discussione sui vantaggi / svantaggi delle chiusure con o senza effetti collaterali.
Sono solo interessato a sapere se l'utilizzo di tali chiusure è ancora considerato stile funzionale dal proponente della programmazione funzionale o se, al contrario, il loro uso è scoraggiato quando si utilizza uno stile funzionale.