Функции карри - Как вызвать 3 (или несколько) функций? - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь вывести функцию в kotlin так, чтобы я мог вызвать ее следующим образом

myAdditionFunction(1)(2)(3)

этот вызов вернул бы 6, потому что 1 + 2 + 3 = 6

Мне просто нужно выполнить сложение по всем числам.на самом деле, я действительно хочу, чтобы в будущем он создавал шаблон для построения, но все еще пытаюсь понять, как работают функции карри.Вот что у меня есть:

fun myAdditionFunction(x: Int) {     { y: Int -> x + y }

это работает для двух параметров. поэтому myAdditionFunction (1) (2) выведет 3.

Я хочу, чтобы он работал для 3 или нескольких: вот что я пробовал для 3 параметров:

fun myAdditionFunction(x: Int) {
        var sum = 0
        return { y: Int ->
             sum = x + y
            sum }
        }

Как мне перенести сумму вперед и как заставить ее принять третью внутреннюю функцию ??это не скомпилируется.

но он не скомпилируется

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Я думаю, что-то не может быть одновременно Int и функцией.Может быть, использовать функцию расширения в классе Int?

operator fun Int.invoke(x: Int) = this + x
val a = 1(2)(3)
0 голосов
/ 03 декабря 2018

С прекрасной идеей Лайонела Бриана создать функцию расширения оператора invoke на Int, вам просто нужна другая функция curry в качестве точки входа

operator fun Int.invoke(x: Int) = this + x

fun curry(x: Int) = x

, и вы можете делать в точности то, что хотели:

curry(1)(2)(3)(4) // will return 10
0 голосов
/ 02 декабря 2018

Я не совсем уверен, что происходит в любом из ваших примеров, и не скомпилирован на моем компьютере (Kotlin 1.3.10).

Однако вы можете делать лямбда-выражения, так как они допускают сколь угодно глубокуювложенности.Таким образом, для 2 переменных вы могли бы иметь

val myAdditionFunction = {x: Int -> {y: Int -> x + y}}

И для трех переменных вы можете пойти на уровень глубже:

val myAdditionFunction = {x: Int -> {y: Int -> {z: Int -> x + y + z}}}

Только для справки, лямбда-выражение (также известное как анонимная функция)находится в форме:

val functionName = {argument1: type -> return_value}
...