【问题标题】:Different brackets style on Scala function definition parameter listScala函数定义参数列表上的不同括号样式
【发布时间】:2013-10-02 22:04:46
【问题描述】:

Scala中以下两个函数定义有什么区别:

1) def sum(f: Int => Int)(a: Int, b: Int): Int = { <code removed> }

2) def sum(f: Int => Int, a: Int, b: Int): Int = { <code removed> }

?

SBT 的控制台 REPL 为它们提供了不同的值,所以看看它们是否有所不同:

sum: (f: Int => Int, a: Int, b: Int)Int

sum: (f: Int => Int)(a: Int, b: Int)Int

【问题讨论】:

    标签: function scala functional-programming higher-order-functions


    【解决方案1】:

    第一个定义是curried,这样你可以在其他时间提供ab

    例如,如果您知道要在当前方法中使用的函数,但还不知道参数,则可以这样使用它:

    def mySum(v: Int): Int = v + 1
    val newsum = sum(mySum) _
    

    此时,newsum 是一个接受两个Ints 并返回一个Int 的函数。

    在求和的上下文中,它似乎没有多大意义;但是,有很多次我想根据我现在知道但还不知道(或无法访问)参数的东西为程序的某些部分返回不同的算法。

    Currying 为你带来了这个功能。

    【讨论】:

      【解决方案2】:

      Scala 函数支持多个参数列表以帮助进行柯里化。从您的第一个示例中,您可以将第一个 sum 函数视为接受两个整数并返回另一个函数(即 curries)的函数,该函数随后可以将 Int => Int 函数作为参数。

      此语法还用于创建外观和行为与新语法相同的函数。例如可以调用def withResource(r: Resource)(block: => Unit)

      withResource(res) { 
          ..
          ..
      }
      

      【讨论】:

        猜你喜欢
        • 2016-10-08
        • 2020-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-09
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        相关资源
        最近更新 更多