仅使用函数实现组合<&燃气轮机;在Java8中

仅使用函数实现组合<&燃气轮机;在Java8中,java,lambda,functional-programming,java-8,Java,Lambda,Functional Programming,Java 8,在本书中,作者仅使用函数接口构建了一个compose函数(尽管该接口不是Java8附带的接口,但非常类似),其片段如下所示 public interface Function<T, U> { U apply(T arg); } 公共接口功能{ U应用(T参数); } 虽然我可以理解下面的compose方法版本,它接受2个函数并返回一个composed函数 public static final Function<Integer, Integer> compose

在本书中,作者仅使用
函数
接口构建了一个compose函数(尽管该接口不是Java8附带的接口,但非常类似),其片段如下所示

public interface Function<T, U> {
  U apply(T arg);
}
公共接口功能{
U应用(T参数);
}
虽然我可以理解下面的compose方法版本,它接受2个函数并返回一个composed函数

public static final Function<Integer, Integer> compose (final Function<Integer, Integer> f1, 
                                   final Function<Integer, Integer> f2) {
         arg -> f1.apply(f2.apply(arg));
}
公共静态最终函数组合(最终函数f1,
最终功能(f2){
arg->f1.apply(f2.apply(arg));
}
我只是无法理解下面的compose实现中的函数和lambdas

static Function<Function<Integer, Integer>,
            Function<Function<Integer, Integer>,
                    Function<Integer, Integer>>> compose =
            x -> y -> z -> x.apply(y.apply(z));
静态函数组合=
x->y->z->x.apply(y.apply(z));

PS:我无法忘记这一点,继续往下看剩下的部分:(

函数
称为整数函数,这里有一个函数将{a integer Function}映射到{a函数将整数函数映射到另一个整数函数}

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

给定一个函数x
返回一个函数,该函数:
给定一个函数y
返回一个函数,该函数:
给定一个整数z
返回x(y(z))

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

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

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

Java代码中所有看起来可怕的东西都只是类型注释。
f
g
(以及
compose
的结果)让类型
Function
。让我们把这个类型写成
T
。然后第二个版本的compose有类型
Function


p.S.函数如
λx.λy.E
称为curried,而
λ(x,y).E
称为uncarried。请参阅:

使用不同类型和/或泛型,这种类型的说明可能更有意义

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

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

可能会看到如何用给定的函数组合两个fxn,但关注的是如何实现该组合函数这确实缺少C指针!