Kotlin 是否支持偏应用?
Does Kotlin support partial application?
由于 Kotlin 支持函数式编程中的许多概念,我想知道是否也有一种方法可以在 Kotlin 中对函数进行部分应用?
一个这样的部分应用程序有用的例子是:
// In one class
fun doSomething(cb: (a, b) -> Unit) {
<some logic here to compute someField>
doSomethingElse(cb.applyPartially(someField))
}
// In another class
fun doSomethingElse(cb: (b) -> Unit) {
<some logic here to compute someOtherField>
cb(someOtherField)
}
开箱即用,没有。但是使用辅助函数并不难:
fun add(a: Int, b:Int): Int {
return a + b
}
fun <A, B, C> partial2(f: (A, B) -> C, a: A): (B) -> C {
return { b: B -> f(a, b)}
}
val add1 = partial2(::add, 1)
val result = add1(2) //3
所以 partial2 接受一个有 2 个参数的函数和第一个参数,并将它应用到一个有 1 个参数的函数。你必须为你需要的所有特性编写这样的助手。
或者,您可以使用扩展方法:
fun <A,B,C> Function2<A,B,C>.partial(a: A): (B) -> C {
return {b -> invoke(a, b)}
}
val abc: (Int) -> Int = (::add).partial(1)
Kotlin 有一个非常漂亮且轻便的库:org.funktionale
。在模块 funktionale-currying
中,您会找到 lambda 的扩展方法:curried()
和 uncurried()
.
示例:
val add = { x: Int, y: Int -> x + y }.curried()
val add3 = add(3)
fun test() {
println(add3(5)) // prints 8
}
由于 Kotlin 支持函数式编程中的许多概念,我想知道是否也有一种方法可以在 Kotlin 中对函数进行部分应用?
一个这样的部分应用程序有用的例子是:
// In one class
fun doSomething(cb: (a, b) -> Unit) {
<some logic here to compute someField>
doSomethingElse(cb.applyPartially(someField))
}
// In another class
fun doSomethingElse(cb: (b) -> Unit) {
<some logic here to compute someOtherField>
cb(someOtherField)
}
开箱即用,没有。但是使用辅助函数并不难:
fun add(a: Int, b:Int): Int {
return a + b
}
fun <A, B, C> partial2(f: (A, B) -> C, a: A): (B) -> C {
return { b: B -> f(a, b)}
}
val add1 = partial2(::add, 1)
val result = add1(2) //3
所以 partial2 接受一个有 2 个参数的函数和第一个参数,并将它应用到一个有 1 个参数的函数。你必须为你需要的所有特性编写这样的助手。
或者,您可以使用扩展方法:
fun <A,B,C> Function2<A,B,C>.partial(a: A): (B) -> C {
return {b -> invoke(a, b)}
}
val abc: (Int) -> Int = (::add).partial(1)
Kotlin 有一个非常漂亮且轻便的库:org.funktionale
。在模块 funktionale-currying
中,您会找到 lambda 的扩展方法:curried()
和 uncurried()
.
示例:
val add = { x: Int, y: Int -> x + y }.curried()
val add3 = add(3)
fun test() {
println(add3(5)) // prints 8
}