纯函数可以改变输入值吗?
Pure functions can change input values?
我正在学习函数式编程,我刚刚阅读了有关纯函数的内容。
我的问题是:一个纯函数可以改变它的参数吗?
这个函数是纯函数吗?
int a(Payment payment){
payment.setValue(payment.getValue() - 1);
return payment.getValue() * 10;
}
这里有两件事:
纯函数是具有 return 值的函数,其值仅基于 其输入参数 ,并且调用该函数具有 无副作用.
您粘贴的那段 Kotlin 代码无法编译(参见 https://ideone.com/fli05T)。编译器说 val cannot be reassigned
。这是因为在 Kotlin 中,函数参数是不可变的。
理论上,如果可以像你写的那样定义这样的函数,那么根据 (1) 的定义,它将是纯粹的,假设参数是按值传递的(在函数内部改变它们不会从函数外部看到的那样改变它们。
规则是没有副作用。改变对象是一种副作用。然而,它并没有真正说你正在变异,所以这里是一个 Payment 版本,你的代码是纯的:
public class Payment
{
private int value;
public Payment(int value) {
this.value = value;
}
public Payment setValue(int value) {
return new Payment(value);
}
public int getValue() {
return value;
}
public static int a(Payment payment) {
payment.setValue(payment.getValue() - 1); // dead code
return payment.getValue() * 10;
}
public static int b(Payment payment) {
return payment
.setValue(payment.getValue() - 1)
.getValue() * 10;
}
public static void main(String args[]) {
Payment p = new Payment(10);
System.out.println(String.valueOf(a(p)));
System.out.println(String.valueOf(b(p)));
}
}
请注意,您的 a
的定义没有改变,它是 100% 的功能。如果你传递它10
它returns 100
,总是输入的10倍。然而,第一行 return 是一个新的 Payment
且值为 9
从未使用过,因此它是死代码。其意图可能是我重写的版本 b
。 b
也可以正常工作。
现在 Payment
的其他实现可能会使 a
和 b
不纯。
许多人认为 OO 和函数式不能混用。 Java、java.lang.String
中最古老和最常用的class之一,既是面向对象的又是纯函数式接口。没有方法发生变化,只有 return 一个新对象。
我正在学习函数式编程,我刚刚阅读了有关纯函数的内容。
我的问题是:一个纯函数可以改变它的参数吗?
这个函数是纯函数吗?
int a(Payment payment){
payment.setValue(payment.getValue() - 1);
return payment.getValue() * 10;
}
这里有两件事:
纯函数是具有 return 值的函数,其值仅基于 其输入参数 ,并且调用该函数具有 无副作用.
您粘贴的那段 Kotlin 代码无法编译(参见 https://ideone.com/fli05T)。编译器说
val cannot be reassigned
。这是因为在 Kotlin 中,函数参数是不可变的。
理论上,如果可以像你写的那样定义这样的函数,那么根据 (1) 的定义,它将是纯粹的,假设参数是按值传递的(在函数内部改变它们不会从函数外部看到的那样改变它们。
规则是没有副作用。改变对象是一种副作用。然而,它并没有真正说你正在变异,所以这里是一个 Payment 版本,你的代码是纯的:
public class Payment
{
private int value;
public Payment(int value) {
this.value = value;
}
public Payment setValue(int value) {
return new Payment(value);
}
public int getValue() {
return value;
}
public static int a(Payment payment) {
payment.setValue(payment.getValue() - 1); // dead code
return payment.getValue() * 10;
}
public static int b(Payment payment) {
return payment
.setValue(payment.getValue() - 1)
.getValue() * 10;
}
public static void main(String args[]) {
Payment p = new Payment(10);
System.out.println(String.valueOf(a(p)));
System.out.println(String.valueOf(b(p)));
}
}
请注意,您的 a
的定义没有改变,它是 100% 的功能。如果你传递它10
它returns 100
,总是输入的10倍。然而,第一行 return 是一个新的 Payment
且值为 9
从未使用过,因此它是死代码。其意图可能是我重写的版本 b
。 b
也可以正常工作。
现在 Payment
的其他实现可能会使 a
和 b
不纯。
许多人认为 OO 和函数式不能混用。 Java、java.lang.String
中最古老和最常用的class之一,既是面向对象的又是纯函数式接口。没有方法发生变化,只有 return 一个新对象。