6

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

4

2 回答 2

4

第一个定义是currieda,以便您可以b在其他时间提供。

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

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

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

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

柯里化为您购买了该功能。

于 2013-09-26T19:43:02.853 回答
2

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

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

withResource(res) { 
    ..
    ..
}
于 2013-09-26T19:38:51.047 回答