方法一:
您需要将这两个整数作为附加参数传递给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
):
fun compose2(a: (Int, Int) -> Int, b: (Int, Int) -> Int) = {
c: Int, d: Int -> a(c, d) + b(c, d)
}
val f = compose2()
f
是一个lambda表达式,可以像这样调用:
f(2, 4)
所以,
compose2
并没有做更多的事情,仅仅返回一个 lambda 表达式,将两个传递进来的 lambda 表达式的结果相加。实际的调用是在
compose2
外部完成的。
更抽象的方法如下:
在您的 compose 函数中,您使用简单的加法作为组合操作。您甚至可以使此操作变量化,通过传递第三个 lambda 表达式
ab
,告诉您的函数如何组合
a
和
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))
}
结果是,再次得到一个接受两个Int并返回一个Int的lambda表达式。
a
和b
通常意味着将a
应用于对某个参数应用b
的结果,但这并不是您实际想要的。 - Marko Topolnikcompose
这个名称表示一些特定的操作:函数f(x)
和g(x)
的组合 是g(f(x))
,而不是函数求和。 - Naetmul