为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森王 2021-08-04 17:09:08
我正在学习函数式编程,我刚刚阅读了纯函数。我的问题是:纯函数可以改变它的参数吗?这个函数是纯函数吗?int a(Payment payment){ payment.setValue(payment.getValue() - 1); return payment.getValue() * 10;}
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

规则是没有副作用。改变一个对象是一个副作用。然而,它并没有真正说你正在变异,所以这里有一个 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它返回100,总是输入的 10 倍。然而,从不使用返回Payment带有值的 new 的第一行,9因此它是死代码。目的可能是我重写的版本,b. b也是功能性的。


现在其他实现Payment可能会产生a和b不纯。


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


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信