Поддерживает ли Котлин частичное применение? - PullRequest
0 голосов
/ 09 октября 2018

Поскольку 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)
}

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Для Котлина есть очень хорошая и легкая библиотека: 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
}
0 голосов
/ 09 октября 2018

Из коробки нет.Но это не так сложно сделать с помощью вспомогательной функции:

    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

Таким образом, Partical2 принимает функцию с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...