Scala函数定义参数列表中的不同括号样式

时间:2013-09-26 19:12:39

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

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

2 个答案:

答案 0 :(得分:4)

第一个定义是curried,以便您可以在其他时间提供ab

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

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

此时,newsum是一个需要两个Int并返回Int的函数。

在总结的背景下,它似乎没有多大意义;但是,有很多次我想根据我现在知道的东西返回不同的程序部分算法,但是还不知道(或者有权访问)参数。

Currying给你带来了这个功能。

答案 1 :(得分:2)

Scala函数支持多个参数列表以帮助进行curry。从第一个示例开始,您可以将第一个sum函数视为一个带有两个整数并返回另一个函数(即 curries )的函数,然后可以将Int => Int函数作为参数。

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

withResource(res) { 
    ..
    ..
}