纯净和不纯的function之间的区别?

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

但我使用的教科书指出:

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

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

编辑

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

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

这个function是纯粹的还是不纯的?

内容取自此链接

纯function的特点:

  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 

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

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

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

亩。 根据定义,您似乎假设访问器是纯函数。 这不一定是这种情况 – 访问器(甚至get -accessor返回值)可能是不纯的,例如在访问顺序模式下(将请求的条目按迭代顺序移动到最后位置)的LinkedHashMapget方法。

这两个陈述都是正确的。

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

例如:

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

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

例如:

 public void setName(String n){ this.name=n; } 

Impure Functions或Mutator方法更改对象的状态并修改存储在Instance Variables中的值。