提问人:Vivek 提问时间:10/18/2020 最后编辑:Dmytro MitinVivek 更新时间:10/18/2020 访问量:233
为什么闭包是 Scala 或任何函数式编程语言的一部分 [已关闭]
why closures are part of scala or any functional programming language [closed]
问:
根据定义,闭包是
Scala 闭包是使用一个或多个自由变量的函数,该函数的返回值依赖于这些变量。自由变量在闭包函数外部定义,不作为此函数的参数包含在内。
纯函数的定义是
纯函数是仅依赖于其声明的输入及其内部算法来产生其输出的函数。它不会从“外部世界”(函数范围之外的世界)读取任何其他值,也不会修改外部世界的任何值。
当函数式编程都是用纯函数来编写代码时,为什么像闭包这样的概念在函数式编程中是合理的
请帮忙澄清理解
答:
1赞
Dmytro Mitin
10/18/2020
#1
请考虑以下示例
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
但是,作为闭包取决于外部作用域的参数(即 )。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)
评论
0赞
Tim
10/18/2020
使用 a 而不是 的原因是什么?是否存在性能差异,还是只是风格问题?lazy val
def
0赞
Dmytro Mitin
10/18/2020
@Tim 嗯,一般来说,选择/肯定不是风格问题,因为它们有不同的语义。这里只是为了说明目的,使 lambda/闭包更加明显。通常我会使用方法和嵌套方法。关于性能,方法可以比函数有更好的性能。def
lazy val
评论