2012-11-25 45 views
23

我是Scala的新手,我正在ScalaSTM上做一些阅读。为什么在这个Scala方法定义中有两组参数/圆括号?

,如果有人可以简单地指明下面的概念,我将不胜感激,从而存在被传递到

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采用什么概念的方法:2组括号?

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

感谢

+11

http://stackoverflow.com/questions/4915027/two-ways-of-currying-in-scala-whats-the-use-case-for-each/4916606 #4916606 – 2012-11-25 04:37:40

+5

提示:将鼠标悬停在“Scala标签”上并点击[“info”链接](http://stackoverflow.com/tags/scala/info)。这里的术语是“多参数列表”。 – 2012-11-25 04:37:57

+0

[Scala的两种方式可能重复;什么是每个用例?](http://stackoverflow.com/questions/4915027/two-ways-of-currying-in-scala-whats-the-use-case-for-each) – DJ180

回答

11

这家名为Currying。咖喱功能是当它具有类型A => B => C时。

功能def foo(a: A, b: B): C具有类型(A, B) => C。另一方面,功能def curriedFoo(a: A)(b: B): C的类型为A => B => C。使用咖喱功能,你可以做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)

相关问题