Scala中的“副作用”是什么?

我目前正在学习使用 Scala 进行函数式编程。

我也在学习循环以及如何避免它们的副作用。

这是什么意思?

回答

纯函数式编程语言中的函数与数学中的函数完全一样:它们根据它们的参数值并且仅基于它们的参数值产生结果

一个副作用(往往只是被称为影响)是一切。即不读取参数并返回结果的所有内容都是副作用。

这包括但不限于:

  • 突变状态,
  • 从控制台读取输入,
  • 打印输出到控制台,
  • 读取、创建、删除或写入文件,
  • 从网络读取或写入,
  • 反射,
  • 根据当前时间,
  • 启动或中止线程或进程,或
  • 真的任何类型的 I/O,最重要的是
  • 调用一个不纯的函数。

最后一个非常重要:调用不纯函数会使函数不纯。从这个意义上说,副作用具有传染性

请注意,说“您只能阅读参数”有些简化。一般来说,我们认为函数的环境也是一种“隐形”参数。这意味着,例如,允许闭包从它关闭的环境中读取变量。允许函数读取全局变量。

Scala 是一种面向对象的语言,它的方法有一个不可见的this参数,它们被允许读取。

这里的重要属性称为参照透明度。如果您可以在不改变程序含义的情况下用其值替换函数或表达式,则该函数或表达式是引用透明的(反之亦然)。

请注意,一般而言,术语“纯”或“纯功能”、“参考透明”和“无副作用”可互换使用。

例如,在下面这个程序中,(子)表达式2 + 3是引用透明的,因为我可以用它的值替换它5而不改变程序的含义:

println(2 + 3)
println(2 + 3)

具有完全相同的含义

println(5)

但是,该println方法不是引用透明的,因为如果我用它的值替换它,程序的含义就会改变:

具有相同的含义

()

这只是值()(发音为“unit”),它是 的返回值println

这样做的结果是,当传递相同的参数时,引用透明函数总是返回相同的结果值。对于所有代码,您应该为相同的输入获得相同的输出。或者更一般地说,如果你一遍又一遍地做同样的事情,同样的结果应该一遍又一遍地发生。

这就是循环和副作用之间的联系所在:循环一遍又一遍地做同样的事情。所以,它应该一遍又一遍地得到相同的结果。但事实并非如此:它至少会有一次不同的结果,即它会完成。(除非它是一个无限循环。)

为了使循环有意义,它们必须具有 Side-Effects。但是,纯函数式程序不能有副作用。因此,循环在纯函数程序中不可能有意义


以上是Scala中的“副作用”是什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>