函数式编程初学者:用Java学习

时间:2015-03-19 17:57:56

标签: java functional-programming

我正在阅读关于函数式编程的讨论,我有一个非常基本的问题:

如果我在Java中有两个函数

 int add(int x, int y){
     return x+y;
}

我创建了另一种方法

  int increment(int y){
       return add(1, y);
   }

在上面的代码中,当我写increment函数时,我实际上是在讨论add吗?

2 个答案:

答案 0 :(得分:7)

您已部分应用add。这与currying有关。

在某些支持部分应用程序的语言中,默认情况下会调用函数。您可以编写如下代码:

increment = add(1)
println(increment(2))
# => 3

curried函数允许您直接部分应用该函数。没有额外的机器,Java就不支持那种东西了。

修改

在Java 8中,使用lambda和java.util.function,您可以定义咖喱函数。

import java.util.function.Function;

public class Example {
    public static <T, U, R> Function<T, Function<U, R>> curry(BiFunction<T, U, R> f) {
        return t -> u -> f.apply(t, u);
    }

    public static int add(int x, int y) {
        return x + y;
    }

    public static void main(String[] args) {
        Function<Integer, Function<Integer, Integer>> curriedAdd = curry(Example::add);
        // or
        // BiFunction<Integer, Integer, Integer> add = (x, y) -> x + y;
        // curriedAdd = curry(add);

        Function<Integer, Integer> increment = curriedAdd.apply(1);
        System.out.println(increment.apply(4));
    }
}
编辑#2:编辑#2: 我错了!我已经纠正/修改了我的答案。正如sepp2k指出的那样,这只是部分功能应用。这两个概念是相关的,经常混淆。在我的辩护中,有关于混淆的维基百科页面的一个部分。

答案 1 :(得分:0)

不,你只是打电话给它。您需要将函数作为参数传递,并返回该函数的部分评估以将其称为currying。