为什么这个Scala方法定义中有两组参数/括号?

JJ1*_*180 34 syntax scala

我是Scala的新手,正在围绕ScalaSTM做一些阅读.

如果有人可以简单地命名下面的概念,我会很感激,因为有两组括号被传递给方法:

def transfer(amount: Int, a: Ref[Int], b: Ref[Int])(c: Transaction) {
  a.:=(a.get(c) - amount)(c)
  b.:=(b.get(c) + amount)(c)
}
Run Code Online (Sandbox Code Playgroud)

内部采用了什么概念c: Transaction

一旦我知道我在寻找什么,我会进一步阅读!

谢谢

Den*_*VDB 22

这是命名Currying.一个curried函数是当它具有类型A => B => C.

该函数def foo(a: A, b: B): C具有类型(A, B) => C.另一方面,该函数def curriedFoo(a: A)(b: B): C具有类型A => B => C.使用curried函数你可以做def curriedFooWithA = curriedFoo(a)类型B => C.您不必一次性提供所有参数.

所以,你的情况,你可以提供amount,ab.你会得到一个功能Transaction.另一种情况是类型的函数Request => DataBase => Int,您只需提供Request,最后当您确实需要运行请求时,提供DataBase必须发送请求的类型.

类型(A, B) => CA => B => C同构.斯卡拉提供tupleduncurried完成这些任务的.

def curriedFoo(a: A)(b: B): C = a => b => foo(a, b)

def foo(a: A, b: B): C => (a, b) => curriedFoo(a, b)