2012-11-25 40 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)

相關問題