scala - 为什么闭包是 scala 或任何函数式编程语言的一部分
问题描述
根据定义,闭包是
Scala 闭包是使用一个或多个自由变量的函数,该函数的返回值取决于这些变量。自由变量在闭包函数之外定义,不作为该函数的参数包含在内。
纯函数的定义是
纯函数是仅依赖于其声明的输入及其内部算法来产生其输出的函数。它不会从“外部世界”(函数范围之外的世界)读取任何其他值,也不会修改外部世界中的任何值。
当函数式编程完全是关于用纯函数编写代码时:如何在函数式编程中证明闭包之类的概念是合理的
请帮助清除理解
解决方案
请考虑以下示例
def factorial(n: Int): Int = {
lazy val loop: (Int, Int) => Int =
(i, acc) =>
if (i == n + 1) acc
else loop(i + 1, acc * i)
loop(1, 1)
}
1
这是从到迭代的阶乘的尾递归版本n
。
从 FP 的角度来看,这里的所有函数(Scala 方法或实际scala.Function
s)都是纯函数,即在相同的输入上它们返回相同的输出并且没有副作用,它们的调用可以用它们的结果替换(引用透明性)。
但是loop
作为闭包取决于外部范围的参数(即n
)。
从外部范围(与写入相反)读取变量(没有副作用)不被视为副作用。
https://alvinalexander.com/scala/fp-book/definition-of-pure-function/
https://en.wikipedia.org/wiki/Pure_function
https://en.wikipedia.org/wiki/Referential_transparency
https://en.wikipedia.org/wiki/Closure_(computer_programming)
推荐阅读
- wordpress - WordPress Favicon 恶意软件
- websphere - 为什么我们在 WAS 中使用 .car 文件?
- javascript - 如何在不使用 setTimeout 的情况下挂钩正在进行的转换?
- swift - 我可以 pushViewController(UIViewController(), animated: true) ins side collection view cell
- terraform - Terraform 变量和计数 = 0
- voip - 如何生成不同IP系列的rtpengine ICE-candidates?
- reactjs - 无法将我的 React 应用程序正确部署到 GitHub
- javascript - 如何用正确的数据填充锚点
- mysql - 与端口 3337 上的 Ensembl VEP 脚本的连接失败
- javascript - 使用 JavaScript 匹配 HTML 表格列的宽度