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

时间:2018-12-02 19:37:14

标签: kotlin currying

我正在尝试在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 :(得分:4)

我不确定您的两个示例中都发生了什么,也没有在我的计算机上编译(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}

答案 1 :(得分:1)

我认为某些东西不能同时是一个Int和一个函数。也许在Int类上使用extention function

operator fun Int.invoke(x: Int) = this + x
val a = 1(2)(3)

答案 2 :(得分:0)

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

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

fun curry(x: Int) = x

您就可以做到自己想要的:

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