【问题标题】:Curry functions - How to call 3 (or multiple) functions?Curry 函数 - 如何调用 3 个(或多个)函数?
【发布时间】:2018-12-02 19:37:13
【问题描述】:

我正在尝试在 kotlin 中对一个函数进行 curry,以便我可以这样调用它

myAdditionFunction(1)(2)(3)

此调用将返回 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 }
        }

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

但它不会编译

【问题讨论】:

  • 也许您想自己构建它,很好,但如果没有,现有的库可以进行柯里化,其中也可以向您展示它是如何完成的。 arrow-kt.io 是其中之一。 funKTionale 是另一个:github.com/MarioAriasC/funKTionale/wiki/Currying.
  • 这在博客上也有很多很好的例子。
  • 只是想自己做,这样我就可以成为客户构建者。好图书馆,我会检查的
  • 太棒了,我会查看这两个库,然后用谷歌搜索这个主题,因为有很多这样的例子可供参考。

标签: kotlin currying


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 加上 1 个好主意 :)
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 2019-01-22
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2021-02-16
      • 2021-12-26
      相关资源
      最近更新 更多