许多现代编程语言都支持某种闭包概念,即一段代码(一个块或一个函数)
- 可以被视为一个值,因此可以存储在变量中,传递给代码的不同部分,可以在一个程序的一部分中定义,并可以在同一程序的完全不同的部分中调用。
- 可以从定义它的上下文中捕获变量,并在以后调用它时访问它们(可能在完全不同的上下文中)。
这是用Scala编写的闭包示例:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
函数文字x => x >= lowerBound
包含free变量lowerBound
,该变量由filterList
具有相同名称的函数的参数关闭(绑定)。该闭包将传递给library方法filter
,该方法可以作为常规函数重复调用它。
我已经在该站点上阅读了很多问题和答案,据我所知,术语闭包通常会自动与函数式编程和函数式编程风格相关联。
维基百科上的函数编程的定义为:
在计算机科学中,函数式编程是一种编程范例,将计算视为对数学函数的评估,并避免了状态数据和可变数据。与强调状态变化的命令式编程风格相反,它强调函数的应用。
并进一步
在函数代码中,函数的输出值仅取决于输入到函数的参数。消除副作用可以使理解和预测程序的行为变得更加容易,这是开发函数式编程的主要动机之一。
另一方面,编程语言提供的许多闭包构造允许闭包捕获非局部变量并在调用闭包时对其进行更改,从而对定义它们的环境产生副作用。
在这种情况下,闭包实现了函数编程的第一个想法(函数是可以像其他值一样移动的一流实体),却忽略了第二个想法(避免了副作用)。
带有副作用的闭包的这种使用是否被视为功能样式,还是被视为可以用于功能性和非功能性编程样式的更通用的构造?是否有关于该主题的文献?
重要的提示
我不是在质疑副作用或关闭副作用的有用性。另外,我对讨论带或不带副作用的闭合的优缺点没有兴趣。
我只想知道函数编程的支持者是否仍将使用此类闭包视为函数样式,或者相反,在使用函数样式时不鼓励使用此类闭包。