Many modern programming languages support some concept of closure, i.e. of a piece of code (a block or a function) that
- Can be treated as a value, and therefore stored in a variable, passed around to different parts of the code, be defined in one part of a program and invoked in a totally different part of the same program.
- Can capture variables from the context in which it is defined, and access them when it is later invoked (possibly in a totally different context).
Here is an example of a closure written in Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] = xs.filter(x => x >= lowerBound)
The function literal
x => x >= lowerBound contains the free variable
lowerBound, which is closed (bound) by the argument of the function
filterList that has the same name. The closure is passed to the library method
filter, which can invoke it repeatedly as a normal function.
I have been reading a lot of questions and answers on this site and, as far as I understand, the term closure is often automatically associated with functional programming and functional programming style.
The definition of function programming on wikipedia reads:
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.
and further on
[...] 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.
On the other hand, many closure constructs provided by programming languages allow a closure to capture non-local variables and change them when the closure is invoked, thus producing a side effect on the environment in which they were defined.
In this case, closures implement the first idea of functional programming (functions are first-class entities that can be moved around like other values) but neglect the second idea (avoiding side-effects).
Is this use of closures with side effects considered functional style or are closures considered a more general construct that can be used both for a functional and a non-functional programming style? Is there any literature on this topic?
I am not questioning the usefulness of side-effects or of having closures with side effects. Also, I am not interested in a discussion about the advantages / disadvantages of closures with or without side effects.
I am only interested to know if using such closures is still considered functional style by the proponent of functional programming or if, on the contrary, their use is discouraged when using a functional style.