web-dev-qa-db-ja.com

Kotlinは部分適用をサポートしていますか?

Kotlinは関数型プログラミングの多くの概念をサポートしているので、Kotlinでも関数の部分適用を行う方法があるかどうか疑問に思いました。

部分適用が役立つ可能性のあるそのような例の1つは次のとおりです。

// 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)
}
10
idunnololz

箱から出して、いいえ。しかし、ヘルパー関数を使用するのはそれほど難しくありません。

    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)
9
triggerNZ

Kotlinには非常に素晴らしくて軽いライブラリがあります:_org.funktionale_。モジュール_funktionale-currying_には、ラムダへの拡張メソッドcurried()uncurried()があります。

例:

_val add = { x: Int, y: Int -> x + y }.curried()
val add3 = add(3)

fun test() {
    println(add3(5)) // prints 8
}
_
3
Cililing