use*_*434 6 java functional-programming
我正在读关于函数式编程的讨论,我有一个非常基本的问题:
如果我在Java中有两个函数
int add(int x, int y){
return x+y;
}
Run Code Online (Sandbox Code Playgroud)
我创建了另一种方法
int increment(int y){
return add(1, y);
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,当我写increment函数时,我实际上是在做咖喱add吗?
你已经部分申请了add.这与currying有关.
在某些支持部分应用程序的语言中,默认情况下会调用函数.你可以编写如下代码:
increment = add(1)
println(increment(2))
# => 3
Run Code Online (Sandbox Code Playgroud)
curried函数允许您直接部分应用该函数.没有额外的机器,Java不支持那种东西.
编辑:
在Java 8中,使用lambdas和java.util.function,您可以定义curry函数.
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));
}
}
Run Code Online (Sandbox Code Playgroud)
编辑#2:我错了!我已经纠正/修改了我的答案.正如sepp2k指出的那样,这只是部分功能应用.这两个概念是相关的,经常混淆.在我的辩护中,有关于混淆的维基百科页面的一节.