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

IT小君   2021-11-10T05:35:18

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

但我使用的教科书指出:

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

我糊涂了。哪一个是正确的?

编辑

有点澄清,让我问的是这个问题:

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

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

评论(5)
IT小君

内容来自此链接

纯函数的特点:

  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

2021-11-10T05:35:18   回复
IT小君

来自维基百科-如果关于函数的这些陈述都成立,则函数可以被描述为纯函数

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

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

2021-11-10T05:35:19   回复
IT小君

亩。 您似乎假设访问器根据定义是纯函数。这不是必需的情况-一个访问器(即使是get-accessor返回值)可以是不纯的,如get的方法LinkedHashMap在访问阶模式(其在移动迭代顺序请求的条目到最后的位置)时。

2021-11-10T05:35:19   回复
IT小君

两种说法都是正确的。

当您创建称为ACCESSOR METHODS 的获取价值的方法时

前任:

public String getName(){
    return this.name;
}

对于设置值,我们使用带有VOID 的方法,称为MUTATOR METHODS

前任:

public void setName(String n){
    this.name=n;
}
2021-11-10T05:35:19   回复
IT小君

不纯函数或 Mutator 方法更改对象的状态并修改存储在实例变量中的值。

2021-11-10T05:35:19   回复