是一个更改输入参数值仍然是纯函数的函数吗?
我的例子(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说纯函数有这两个要求:
根据我的理解,我的例子中的所有功能都符合第一个要求。
我的不确定性始于第二个要求。随着输入参数的改变,我改变一个对象(规则违反),但是这个对象不在函数范围之外,所以可能没有规则违规?
此外,纯函数是否总是需要返回一个全新的值?
我认为,这个功能被认为是100%纯净的:
fun pureIncrement(klicker: Klicker): Klicker {
return klicker.copy(value = klicker.value++)
}
温柔,这是我的第一个Stackoverflow问题。
答案 0 :(得分:3)
increment
和decrement
函数既不满足纯函数的要求。它们的返回值取决于Klicker
类的状态,它可能在程序执行过程中发生变化,因此第一个要求未得到满足。对结果的评估会改变可变Klicker
实例,因此第二个要求也未得到满足。可变数据在哪个范围内并不重要;纯函数不能改变任何数据。
reset
功能仅违反第二项要求。
如果将pureIncrement
函数更改为:
fun pureIncrement(klicker: Klicker): Klicker {
return klicker.copy(value = klicker.value + 1)
}