我试图弄清楚如何将一个函数声明地定义为Kotlin中另外两个函数的组合,但我正在努力 . 这是我的代码:
fun compose(a: (Int, Int) -> Int, b: (Int, Int) -> Int): Int {
return a.invoke() + b.invoke()
}
compose函数的思想是它将接受两个函数作为它的输入(两个函数都需要两个Ints并返回一个Int)并返回两个传递函数的结果之和 . 问题是我必须调用传递的函数来计算它们的总和(显然是lol)但我不知道我希望在compose方法中调用的值(它们是传递给函数的值) .
我在这里完全遗漏了什么吗?我知道这可能是像Haskell这样的语言,Kotlin是否有可能?
3 回答
One way:
您必须将两个Int作为附加参数传递给
compose
,如下所示:Lambdas是一个进一步的抽象层次,它使您有机会使行为变量,您仍然必须为它们提供数据 .
A more abstract approach:
你可以进一步抽象,让
compose
返回一个lambda,它结合了另外两个lambda的结果(让我们称之为compose2
):f
是一个lambda本身,可以像这样调用:所以,
compose2
只会返回一个lambda,它会添加两个传递的lambdas的结果 . 实际调用在compose2
之外完成 .An even more abstract approach:
在您的撰写功能中,您可以使用简单的添加作为合成操作 . 你甚至可以通过传递第三个lambda
ab
来使这个操作变量,它告诉你的函数如何编写a
和b
:结果又是一个lambda,它接受两个Ints并返回一个Int .
您需要一个新函数
(Int, Int) -> Int
,它是两个(Int, Int) -> Int
函数的总和 .因此,
compose(...)
返回的是另一个(Int, Int) -> Int
类型的函数 .现在,我们有函数类型
compose
. 它返回一个函数,而不是Int
值 .它的身体怎么样?
它将返回一个函数 . 让我们返回一个lambda表达式
{ x: Int, y: Int -> a(x, y) + b(x, y) }
.现在我们可以省略所有不必要的部分 .
而已 .
另一个有 Value 的方法是使用 infix extension function . 对于参数类型为
Int
的情况,它可以是这样的: