纯函数可以改变输入参数吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯函数可以改变输入参数吗?相关的知识,希望对你有一定的参考价值。

是一个更改输入参数值仍然是纯函数的函数吗?

我的例子(Kotlin):

data class Klicker(
    var id: Long = 0,
    var value: Int = 0
)

fun Klicker.increment() = this.value++

fun Klicker.decrement() = this.value--

fun Klicker.reset() {
    this.value = 0
}

Wikipedia说纯函数有这两个要求:

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

根据我的理解,我的例子中的所有功能都符合第一个要求。

我的不确定性始于第二个要求。随着输入参数的改变,我改变一个对象(规则违反),但是这个对象不在函数范围之外,所以可能没有规则违规?

此外,纯函数是否总是需要返回一个全新的值?

我认为,这个功能是100%纯粹的:

fun pureIncrement(klicker: Klicker): Klicker {
    return klicker.copy(value = klicker.value++)
}

温柔,这是我的第一个Stackoverflow问题。

答案

incrementdecrement函数既不满足纯函数的要求。它们的返回值取决于Klicker类的状态,它可能在程序执行过程中发生变化,因此第一个要求未得到满足。对结果的评估会改变可变的Klicker实例,因此第二个要求也未得到满足。可变数据的范围无关紧要;纯函数不能改变任何数据。

reset函数仅违反第二个要求。

如果您将pureIncrement函数更改为:

fun pureIncrement(klicker: Klicker): Klicker {
    return klicker.copy(value = klicker.value + 1)
}

以上是关于纯函数可以改变输入参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 regasm 时,所有参数都输入为输入?那可以改变吗?

js —— 纯函数

纯函数是什么?

前端学习之函数式编程—纯函数

函数中的错误...我可以在函数中传递输入参数吗? [复制]

条目三十九 确保判别式是“纯函数”