【问题标题】:Java 8 partial function application /curryingJava 8 部分函数应用程序/currying
【发布时间】:2016-04-11 09:58:17
【问题描述】:
 public static <T, U, R> Function<U, R> partial(BiFunction<T, U, R> f, T x) {
        return (y) -> f.apply(x, y);
    }

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

【问题讨论】:

标签: java lambda currying partial-application


【解决方案1】:

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

Tx 参数的类型参数。

partial 接受两个参数:

  • f,一个接受TU并返回R的函数:
    BiFunction&lt;T, U, R&gt; f

  • x,其类型为T
    T x

partial 返回一个只接受U(不是TU)并返回R 的新函数。在调用f 时,新函数使用partial 提供的x,而不是期待T 参数。

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

我们在声明开头附近有&lt;T, U, R&gt; 的原因是Java 语法允许我们指定partial 是一个泛型方法,使用类型参数TUR(否则,它们看起来像类型 names,而不是类型 parameters)。

【讨论】:

  • 所以在 "static " 中的 T 被 "BiFunction f" 和 U="T x" 代替?
  • @microwth: 不,TUR 都是在调用方法时指定的,以便为这些类型参数提供具体类型。 partial 所做的是返回一个接受U 并返回R 的函数,该函数调用接受TU 并返回R 指定值x 的原始函数。例如,如果我有一个方法 Widget foo(String, List),我可以使用 partial 来获取一个 ``Widget partialFoo(List)`,它将以 x 作为字符串调用 foo。更多泛型教程:docs.oracle.com/javase/tutorial/extra/generics/methods.html
  • @t-j-crowder “调用原始函数”的意思是函数“f”?所以它就像“return (y) -> f.apply(x, y);”是"Function" 然后,当f.apply(x, y)运行时返回一个值,所以变成return(y)->value,这是一个满足静态。对吗?
  • @microwth: (y) -&gt; f.apply(x, y) 创建一个函数,这是 partial 返回的。该函数接受y。函数体实际上是return f.apply(x, y);,所以当你调用函数partial返回时,它调用f,传入x(你给partial的那个)作为第一个参数和y(你在调用函数 partial 返回时给出的那个)作为第二个参数,然后它返回 f 返回的任何值。
猜你喜欢
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
相关资源
最近更新 更多