我将对所有函数返回值使用某种类型A
;你需要自己整理出真正的类型。
这是您描述的意图:
- 函数
fx
将产生两个参数,我们称它们为a
和b
。
- 函数
f3
将处理 valuea
和 yield a'
。
- 最后,
fy
将消费a'
和b
生产c
。
让我们看看我们如何实现这一点(我将为类型签名编写伪代码):
定义fy
为一个接受两个参数并返回一个参数的函数:
(A, A) => A
定义fyp
(“fy preprocessed”的缩写)作为一个函数,它接受一些预处理函数p
并执行你的逻辑fy
,但第一个参数用p
. 我们将把它写成P => FY
,其中P
是预处理函数FY
的类型签名, 是 的类型签名fy
:
P => FY, which expands to
(A => A) => (A, A) => A
所以这个函数的实现应该以p
type的预处理函数A => A
作为输入,执行fy
(这是右手边,(A, A) => A
...注意它是如何对应的签名的fy
)的逻辑,但是在执行逻辑之前,它会映射fy
with的第一个参数p
。这是一些 Scala 实现供参考(我对 Java 不太擅长):
val fyp: (A => A) => ((A, A)) => A =
f => fyuParams => performFyLogic((f(fyuParams._1), fyuParams._2))
你的函数performFyLogic
的实际处理逻辑在哪里。fy
将最终组合定义为:
f1 -> f2 -> fx -> fyp(f3)
这是完整的 Scala 实现供参考(同样,不太了解 Java 8):
val f1: Int => Int = _ + 1
val f2: Int => Int = _ + 2
val f3: Int => Int = _ + 3
val fx: Int => (Int, Int) = i => (i + 4, i + 5)
// let's assume that the original fy simply sums up its two parameters
val fyp: (Int => Int) => ((Int, Int)) => Int =
f => fyArgs => f(fyArgs._1) + fyArgs._2
val composed1 = f1 andThen f2 andThen f3
println(composed1(42)) // 48
val composed2 = f1 andThen f2 andThen fx andThen fyp(f3)
println(composed2(42)) // 102
// because:
// f1 -> f2 -> fx = (42 + 1 + 2 + 4, 41 + 1 + 2 + 5) = (49, 50)
// fyp(f3)((49, 50)) = (49 + 3) + 50 = 102