java - 函数式编程初学者 : Currying in Java

标签 java functional-programming

我在阅读有关函数式编程中的柯里化(Currying)的文章,我有一个非常基本的问题:

如果我在 Java 中有两个函数

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

然后我创建了另一种方法

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

在上面的代码中,当我编写increment 函数时,我实际上是在柯里化(Currying)add 吗?

最佳答案

您已部分应用add。这与柯里化(Currying)有关。

在一些支持部分应用的语言中,函数默认是柯里化(Currying)的。您可能可以编写如下代码:

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

柯里化(Currying)函数允许您直接部分应用该函数。如果没有额外的机制,Java 不支持这种事情。

编辑:

在 Java 8 中,使用 lambda 和 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: 我错了!我已经更正/修改了我的答案。正如 sepp2k 所指出的,这只是部分功能应用程序。这两个概念是相关的,而且经常混淆。在我的辩护中,currying Wikipedia 页面上有一个关于混淆的部分。

关于java - 函数式编程初学者 : Currying in Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29151796/

相关文章:

ruby - foo(&nil) 与 foo(&"not a proc") 的行为有何不同?

functional-programming - 函数式语言中如何使用闭包

java - 与 Java 或其他非函数式语言相比,Scala 究竟如何利用更多的核心?

java - 如何使用 Java 在 WebDriver 中的隐藏文本框中键入文本

java - 在一个单元格中添加多个编辑器

java - Java 编译器是否有非类型删除的泛型扩展可用作第 3 方编译器扩展?

java - 如何合理处理来自3rd-party API的RuntimeExceptionS?

java - 获取形状相交的中心(2D)

functional-programming - 函数式编程的陷阱/缺点

java - 在 Java 8 中构建 Map 以进行集成测试的重构方法 - 函数式编程的机会?