首页 > 解决方案 > 为什么闭包是 scala 或任何函数式编程语言的一部分

问题描述

根据定义,闭包是

Scala 闭包是使用一个或多个自由变量的函数,该函数的返回值取决于这些变量。自由变量在闭包函数之外定义,不作为该函数的参数包含在内。

纯函数的定义是

纯函数是仅依赖于其声明的输入及其内部算法来产生其输出的函数。它不会从“外部世界”(函数范围之外的世界)读取任何其他值,也不会修改外部世界中的任何值。

当函数式编程完全是关于用纯函数编写代码时:如何在函数式编程中证明闭包之类的概念是合理的

请帮助清除理解

标签: scalafunctional-programmingclosurespure-function

解决方案


请考虑以下示例

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.Functions)都是纯函数,即在相同的输入上它们返回相同的输出并且没有副作用,它们的调用可以用它们的结果替换(引用透明性)。

但是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)


推荐阅读