Curry 函数 - 如何调用 3 个(或多个)函数?

Curry functions - How to call 3 (or multiple) functions?

我正在尝试在 kotlin 中柯里化一个函数,以便我可以这样调用它

myAdditionFunction(1)(2)(3)

这个调用会 return 6 因为 1+ 2 + 3 = 6

我只需要它对所有数字进行加法运算。实际上我真的很想让它做一个生成器 未来的模式,但仍在尝试了解 curry 函数的工作原理。这是我目前所拥有的:

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 }
        }

我如何将总和向前推进以及如何使其采用第三个内部函数??它不会编译。

但它不会编译

我不太确定你的两个示例中发生了什么,也没有在我的机器上编译 (Kotlin 1.3.10)。

但是,您可以使用 lambda 表达式,因为它们允许任意深度嵌套。所以对于 2 个变量,你可以有

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

对于三个变量,您可以更深入地了解:

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

仅供参考,lambda 表达式(又名匿名函数)的形式为:

val functionName = {argument1: type -> return_value}

我认为不能同时是 Int 和函数。也许在 Int class?

上使用 extention function
operator fun Int.invoke(x: Int) = this + x
val a = 1(2)(3)

有了 Lionel Briand 在 Int 上创建运算符扩展函数 invoke 的好主意,您只需要另一个函数 curry 作为入口点

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

fun curry(x: Int) = x

您可以完全按照自己的意愿行事:

curry(1)(2)(3)(4) // will return 10