One way:
您必须将两个 Int 作为附加参数传递给compose
像这样:
fun compose(
c: Int, d: Int, a: (Int, Int) -> Int, b: (Int, Int) -> Int
) = a(c, d) + b(c, d)
Lambda 是更高层次的抽象,它使您有机会使行为可变,但您仍然需要向它们提供数据。
更抽象的方法:
你可以进一步抽象并让compose
返回一个 lambda,它结合了其他两个 lambda 的结果(我们称其为compose2
):
// return type is inferred to (Int, Int) -> Int
fun compose2(a: (Int, Int) -> Int, b: (Int, Int) -> Int) = {
c: Int, d: Int -> a(c, d) + b(c, d)
}
val f = compose2(/* pass lambdas */)
f
本身就是一个 lambda 表达式,可以这样调用:
f(2, 4)
So, compose2
只是返回一个 lambda,它将两个传递的 lambda 的结果相加。实际的调用是在外部完成的compose2
.
一种更抽象的方法:
在您的组合函数中,您使用简单的加法作为组合操作。您甚至可以通过传递第三个 lambda 来使此操作变量ab
它告诉你的函数如何组合a
and b
:
fun compose3(
a: (Int, Int) -> Int, b: (Int, Int) -> Int, ab: (Int, Int) -> Int
) = {
c: Int, d: Int -> ab(a(c, d), b(c, d))
}
结果还是一个 lambda,它接受两个 Int 并返回一个 Int。