根据定义,闭包是
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)