函数式编程初学者:柯里化 Java
Functional Programming Beginner : Currying in Java
我在阅读有关函数式编程中的柯里化的文章,我有一个非常基本的问题:
如果我在Java
中有两个函数
int add(int x, int y){
return x+y;
}
然后我创建了另一个方法
int increment(int y){
return add(1, y);
}
在上面的代码中,当我写 increment
函数时,我实际上是在柯里化 add
吗?
不,你只是调用它。您需要将函数作为参数传递,并且 return 对该函数进行部分评估以将其称为柯里化。
您已部分申请 add
。这与柯里化有关。
在一些支持偏应用的语言中,函数默认是柯里化的。您可能可以编写如下代码:
increment = add(1)
println(increment(2))
# => 3
柯里化函数允许您直接部分应用该函数。 Java 不支持那种没有额外机器的东西。
编辑:
在Java8中,使用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));
}
}
编辑#2:
我错了!我 corrected/modified 我的答案。正如 sepp2k 所指出的,这只是部分功能应用程序。这两个概念是相关的,而且经常混淆。在我的辩护中,currying 维基百科页面上有一个关于混淆的部分。
我在阅读有关函数式编程中的柯里化的文章,我有一个非常基本的问题:
如果我在Java
中有两个函数 int add(int x, int y){
return x+y;
}
然后我创建了另一个方法
int increment(int y){
return add(1, y);
}
在上面的代码中,当我写 increment
函数时,我实际上是在柯里化 add
吗?
不,你只是调用它。您需要将函数作为参数传递,并且 return 对该函数进行部分评估以将其称为柯里化。
您已部分申请 add
。这与柯里化有关。
在一些支持偏应用的语言中,函数默认是柯里化的。您可能可以编写如下代码:
increment = add(1)
println(increment(2))
# => 3
柯里化函数允许您直接部分应用该函数。 Java 不支持那种没有额外机器的东西。
编辑:
在Java8中,使用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));
}
}
编辑#2: 我错了!我 corrected/modified 我的答案。正如 sepp2k 所指出的,这只是部分功能应用程序。这两个概念是相关的,而且经常混淆。在我的辩护中,currying 维基百科页面上有一个关于混淆的部分。