Java 8 偏函数应用/currying

mic*_*wth 5 java lambda currying partial-application

 public static <T, U, R> Function<U, R> partial(BiFunction<T, U, R> f, T x) {
        return (y) -> f.apply(x, y);
    }
Run Code Online (Sandbox Code Playgroud)

在上面的表达式中,我可以理解函数partial返回另一个函数,Function<U, R>。它Function<U, R>本身返回一个 R 值。其余的static <T, U, R>代表什么?我的意思是如果Function<U, R>返回一个 R 是怎么回事<T, U, R>

T.J*_*der 6

(我知道它在 Java 术语中在技术上不正确,但我将在下面说“参数”,我的意思是“形式参数”,因为在任何地方混合“形式参数”和“类型参数”是令人困惑的。)

T是参数的类型参数x

partial 接受两个参数:

  • f, 一个接受 aT和 aU并返回 an的函数R
    BiFunction<T, U, R> f

  • x,这是类型T
    T x

partial返回一个只接受 a U(不是 aT和 a U)并返回的新函数RT新函数不需要参数,而是在调用 时使用x提供的 to 。partialf

简而言之:它返回一个新函数,其中第一个参数(类型T)已通过的参数部分应用(柯里化)。partialx

我们有理由<T, U, R>附近的声明的开头是,这是Java的语法如何让我们指定partial是一种通用方法,使用类型参数TU以及R(否则,它们看起来像类型的名称,而不是输入参数)。