Molti linguaggi di programmazione moderni supportano alcuni concetti di chiusura , ovvero di un pezzo di codice (un blocco o una funzione) che
- Può essere considerato come un valore, e quindi memorizzato in una variabile, passato a diverse parti del codice, 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 completamente diverso).
Ecco un esempio di 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 viene chiusa (vincolata) dall'argomento della funzione filterList
che ha lo stesso nome. La chiusura viene passata al metodo di libreria filter
, che può richiamarlo ripetutamente come una funzione normale.
Ho letto molte domande e risposte su questo sito e, per quanto ho capito, il termine chiusura è spesso associato automaticamente alla programmazione funzionale e funzionale stile di programmazione.
La definizione della programmazione delle funzioni su wikipedia recita:
In computer science, functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data. It emphasizes the application of functions, in contrast to the imperative programming style, which emphasizes changes in state.
e più avanti
[...] in functional code, the output value of a function depends only on the arguments that are input to the function [...]. Eliminating side effects can make it much easier to understand and predict the behavior of a program, which is one of the key motivations for the development of functional programming.
D'altro canto, molti costrutti di chiusura forniti dai linguaggi di programmazione consentono a una chiusura di acquisire variabili non locali e modificarle quando viene richiamata la chiusura, producendo quindi 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 gli 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'è qualche letteratura su questo argomento?
NOTA IMPORTANTE
Non sto mettendo in dubbio l'utilità di 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.
Mi interessa solo sapere se l'uso di tali chiusure è ancora considerato uno stile funzionale dal proponente della programmazione funzionale o se, al contrario, il loro uso è scoraggiato quando si utilizza uno stile funzionale.