函数调用中的多个括号

pis*_*hio 2 scala

我对Scala表示法有点困惑:

List(1, 2, 3).foldLeft(0)((x, acc) => acc+x)
Run Code Online (Sandbox Code Playgroud)

"0"和函数都是foldLeft的参数,为什么它们在两个相邻的括号组中传递?我认为这是有用的:

List(1, 2, 3).foldLeft(0, ((x, acc) => acc+x))
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.任何人都可以向我解释这个吗?另外,如何以及为什么声明这种类型的功能?谢谢

om-*_*nom 6

Scala允许您拥有多个参数列表:

def foo(a: Int)(b: String) = ???
def bar(a: Int)(b: String)(c: Long) = ???
Run Code Online (Sandbox Code Playgroud)

对foldLeft使用这种语法的原因是编译器进行类型推断的方式:前一组参数中的已推断类型用于推断连续参数组中的类型.在foldLeft的情况下,它允许你删除旁边的类型归属(x, acc),所以而不是:

List(1, 2, 3).foldLeft(0)((x: Int, acc: Int) => acc+x)
Run Code Online (Sandbox Code Playgroud)

你可以写

List(1, 2, 3).foldLeft(0)((x, acc) => acc+x)
Run Code Online (Sandbox Code Playgroud)

  • 和往常一样,多个参数列表和currying是两个非常不同的东西. (2认同)