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

时间:2018-03-02 12:20:47

标签: functional-programming kotlin

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

我的例子(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设备。
  3. 根据我的理解,我的例子中的所有功能都符合第一个要求。

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

reset功能仅违反第二项要求。

如果将pureIncrement函数更改为:

,则可以使其成为纯函数
fun pureIncrement(klicker: Klicker): Klicker {
    return klicker.copy(value = klicker.value + 1)
}