Muchos lenguajes de programación modernos admiten algún concepto de cierre , es decir, un fragmento de código (un bloque o una función) que
- Puede tratarse como un valor y, por lo tanto, almacenarse en una variable, transmitirse a diferentes partes del código, definirse en una parte de un programa e invocarse en una parte totalmente diferente del mismo programa.
- Puede capturar variables del contexto en el que se define y acceder a ellas cuando se invoca posteriormente (posiblemente en un contexto totalmente diferente).
Aquí hay un ejemplo de un cierre escrito en Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
El literal de la función x => x >= lowerBound
contiene la variable libre lowerBound
, que está cerrada (vinculada) por el argumento de la función filterList
que tiene el mismo nombre. El cierre se pasa al método de la biblioteca filter
, que puede invocarlo repetidamente como una función normal.
He estado leyendo muchas preguntas y respuestas en este sitio y, por lo que entiendo, el término cierre a menudo se asocia automáticamente con la programación funcional y el estilo de programación funcional.
La definición de programación de funciones en wikipedia dice:
En informática, la programación funcional es un paradigma de programación que trata la computación como la evaluación de funciones matemáticas y evita el estado y los datos mutables. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativo, que enfatiza los cambios de estado.
y más adelante
[...] en el código funcional, el valor de salida de una función depende solo de los argumentos que se ingresan a la función [...]. Eliminar los efectos secundarios puede hacer que sea mucho más fácil comprender y predecir el comportamiento de un programa, que es una de las motivaciones clave para el desarrollo de la programación funcional.
Por otro lado, muchas construcciones de cierre proporcionadas por lenguajes de programación permiten un cierre para capturar variables no locales y cambiarlas cuando se invoca el cierre, produciendo así un efecto secundario en el entorno en el que se definieron.
En este caso, los cierres implementan la primera idea de programación funcional (las funciones son entidades de primera clase que se pueden mover como otros valores) pero descuidan la segunda idea (evitando los efectos secundarios).
¿Este uso de cierres con efectos secundarios se considera un estilo funcional o los cierres se consideran una construcción más general que puede usarse tanto para un estilo de programación funcional como no funcional? ¿Hay alguna literatura sobre este tema?
NOTA IMPORTANTE
No estoy cuestionando la utilidad de los efectos secundarios o de tener cierres con efectos secundarios. Además, no estoy interesado en una discusión sobre las ventajas / desventajas de los cierres con o sin efectos secundarios.
Solo me interesa saber si el uso de tales cierres todavía se considera estilo funcional por el proponente de la programación funcional o si, por el contrario, se desaconseja su uso cuando se usa un estilo funcional.