我试图弄清楚如何在 Kotlin 中将一个函数声明性地定义为其他两个函数的组合,但我很挣扎。这是我的代码:
fun compose(a: (Int, Int) -> Int, b: (Int, Int) -> Int): Int {
return a.invoke() + b.invoke()
}
Run Code Online (Sandbox Code Playgroud)
compose 函数的想法是,它将接受两个函数作为输入(这两个函数都接受两个 Int 并返回一个 Int)并返回两个传递函数的结果之和。问题是我必须调用传递的函数来计算它们的总和(显然大声笑)但我不知道我希望在 compose 方法内部调用的值(它们是传递给函数的值)。
我在这里完全错过了什么吗?我知道这在像 Haskell 这样的语言中是可能的,在 Kotlin 中是否可能?
单程:
您必须将两个 Int 作为附加参数传递,compose如下所示:
fun compose(
c: Int, d: Int, a: (Int, Int) -> Int, b: (Int, Int) -> Int
) = a(c, d) + b(c, d)
Run Code Online (Sandbox Code Playgroud)
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 */)
Run Code Online (Sandbox Code Playgroud)
f本身就是一个 lambda 表达式,可以这样调用:
f(2, 4)
Run Code Online (Sandbox Code Playgroud)
因此,compose2仅返回一个 lambda,它将两个传递的 lambda 的结果相加。实际的调用是在compose2.
一种更抽象的方法:
在您的组合函数中,您使用简单的加法作为组合操作。您甚至可以通过传递第三个 lambda 来使此操作变量,ab该 lambda 告诉您的函数如何组成aand 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))
}
Run Code Online (Sandbox Code Playgroud)
结果还是一个 lambda,它接受两个 Int 并返回一个 Int。
| 归档时间: |
|
| 查看次数: |
3404 次 |
| 最近记录: |