【问题标题】:Implementing compose using only Function<> in java 8在 java 8 中仅使用 Function<> 实现 compose
【发布时间】:2016-06-23 15:43:59
【问题描述】:

Functional Programming in Java 一书中,作者仅使用Function&lt;T, U&gt; 接口构建了一个 compose 函数(但该接口不是 Java 8 附带的,但非常相似),其 sn-p 如下所示

public interface Function<T, U> {
  U apply(T arg);
}

虽然我可以理解下面compose的方法版本,它接受2个函数并返回一个组合函数

public static final Function<Integer, Integer> compose (final Function<Integer, Integer> f1, 
                                   final Function<Integer, Integer> f2) {
         arg -> f1.apply(f2.apply(arg));
}

我只是无法理解下面使用 Function 和 lambdas 的 compose 实现

static Function<Function<Integer, Integer>,
            Function<Function<Integer, Integer>,
                    Function<Integer, Integer>>> compose =
            x -> y -> z -> x.apply(y.apply(z));

PS:我无法忘记这一点并继续阅读其余部分:(

【问题讨论】:

标签: java lambda functional-programming java-8


【解决方案1】:

Function&lt;Integer, Integer&gt; 称为整数函数,您所拥有的是将{一个整数函数}映射到{一个将整数函数映射到另一个整数函数的函数}的函数。

具体来说,当给定一个整数函数x 时,它返回一个函数,给定一个整数函数y,返回一个整数函数,该函数将整数z 映射到x(y(z))

Given a function x
Returns a function that:
    Given a function y
    Returns a function that:
        Given an integer z
        Returns x(y(z))

【讨论】:

    【解决方案2】:

    让我使用一个更简单的 λ 符号省略类型,其中 λx.E 表示一个函数,它接受一个参数 x 并返回 E 的值。例如,λx. λy. x+y 是一个接受x 并返回λy. x+y 的函数,它本身就是一个接受y 并返回x+y 的函数。让我们也为一个接受两个参数xy的函数写λ(x,y).E,并返回E的值。例如,λ(x,y). x+y 是一个函数,它同时接受 xy 并返回 x+y

    那么compose 的“两个参数同时”版本是:λ(f,g). λx.f(g(x))

    第二个“一对一”版本是:λf. λg. λx.f(g(x))

    Java 代码中看起来很吓人的其他一切都只是类型注释。 fg(以及 compose 的结果)都具有 Function &lt; Integer, Integer &gt; 类型。让我们将此类型写为T。那么 compose 的第二个版本的类型为 Function &lt; T, Function &lt; T, T &gt; &gt;

    附:像λx. λy. E 这样的函数被称为curried,而λ(x,y). Euncurried。见:https://en.wikipedia.org/wiki/Currying

    【讨论】:

      【解决方案3】:

      这种类型的插图使用不同的类型和/或泛型可能更有意义。

      Function<Function<R, S>,
               Function<Function<T, R>,
                        Function<T, S>>> compose = x -> y -> z -> x.apply(y.apply(z));
      

      编辑:类型放置不正确(这就是为什么当它们不同时它是一个更好的练习)

      【讨论】:

        猜你喜欢
        • 2017-05-20
        • 2019-05-30
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        相关资源
        最近更新 更多