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
答案 0 :(得分:4)
第一个定义是curried,以便您可以在其他时间提供a
和b
。
例如,如果您知道要在当前方法中使用的函数,但还不知道参数,则可以使用它:
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) {
..
..
}