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



我正在学习函数式编程,我刚刚读到了纯函数。

我的问题是:纯函数可以改变其参数吗?

这个函数是纯粹的吗?

int a(Payment payment){
payment.setValue(payment.getValue() - 1);
return payment.getValue() * 10;
}

这里有两件事:

  1. 纯函数是仅基于其输入参数的返回值的函数,调用该函数没有副作用

  2. 您粘贴的 Kotlin 代码段无法编译(参见 https://ideone.com/fli05T(。编译器说val cannot be reassigned.这是因为在 Kotlin 中,函数参数是不可变的。

从理论上讲,如果可以定义你写的这样的函数,那么根据 (1( 的定义,假设参数是按值传递的(在函数内部更改它们不会从函数外部看到改变它们(。

规则是没有副作用。改变对象是一种副作用。但是,它并没有真正说您正在变异,因此这是一个付款版本,其中您的代码是纯的:

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它返回100,始终是输入的 10 倍。但是,返回值为9的新Payment的第一行永远不会使用,因此它是死代码。意图可能是我重写的版本,b.b也是功能性的。

现在,Payment的其他实现可能会使ab不纯。

许多人认为OO和功能不能混合。Java中最古老和最常用的类之一,java.lang.String,既是面向对象的,也是纯函数式接口。没有方法会变异,只返回一个新对象。

最新更新