纯函数和不纯函数的区别?

2022-09-02 05:29:11

我假设纯函数必须始终具有返回类型(即,不得为),并且必须具有相同的输出,而不管对象的状态如何,并且 Impure 函数更改对象的状态或打印对象的状态。void

但我使用的教科书指出:

访问器通常包含 return 语句,但打印有关对象状态的信息的方法也可以归类为访问器。

我很困惑。哪一个是正确的?

编辑

稍微澄清一下,让我问的就是这个问题:

最后一个问题是“给出使用的功能类型”,在那里发表评论的人说,这是一个不纯的功能,因为它是打印的。

那么这个函数是纯的还是不纯的呢?


答案 1

此链接获取的内容

纯功能特点:

  1. 纯函数的返回值仅取决于其参数 因此,如果使用相同的参数集调用纯函数,则将始终获得相同的返回值。

  2. 它们没有任何副作用,如网络或数据库调用

  3. 它们不会修改传递给它们的参数

不纯函数的特征

  1. 不纯函数的返回值不完全取决于其参数 因此,如果您使用相同的参数集调用不纯函数,则可能会获得不同的返回值 例如,Math.random(), Date.now()

  2. 它们可能会产生任何副作用,如网络或数据库调用

  3. 他们可以修改传递给他们的参数

function impureFunc(value){
  return Math.random() * value;
}

function pureFunc(value){
  return value * value;
}

var impureOutput = [];
for(var i = 0; i < 5; i++){
   impureOutput.push(impureFunc(5));
}

var pureOutput = [];
for(var i = 0; i < 5; i++){
   pureOutput.push(pureFunc(5));
}

console.log("Impure result: " + impureOutput); // result is inconsistent however input is same. 

console.log("Pure result: " + pureOutput); // result is consistent with same input

答案 2

来自维基百科 - 如果关于函数的这两个语句都成立,则函数可以被描述为函数:

  1. 该函数始终在给定相同参数值的情况下计算相同的结果值。函数结果值不能依赖于任何隐藏的信息或状态,这些信息或状态可能会随着程序执行的进行或在程序的不同执行之间而变化,也不能依赖于来自 I/O 设备的任何外部输入。
  2. 结果的评估不会导致任何语义上可观察的副作用或输出,例如可变对象的突变或输出到I / O设备。

因此,如果与代码相比,任何一个语句都是假的,那么它就是不纯的。


推荐