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

时间:2012-11-25 04:32:31

标签: scala syntax

我是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)
}

c: Transaction中使用了什么概念?

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

由于

1 个答案:

答案 0 :(得分:19)

这名为Currying。一个curried函数是当它具有类型A => B =>下进行。

函数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。您不必一次性提供所有参数。

因此,在您的情况下,您可以提供amountab。您将获得一个Transaction的函数。另一种情况是Request => DataBase => Int类型的函数,您只需提供Request,最后当您确实需要运行请求时,请提供请求所必需的DataBase。被发送。

类型(A, B) => CA => B => C是同构的。 Scala提供了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)