2012-11-25 7 views
23

Sono nuovo di Scala e sto facendo alcune letture su ScalaSTM.Perché ci sono due serie di argomenti/parentesi in questa definizione del metodo Scala?

sarei grato se qualcuno potrebbe semplicemente nominare il concetto di seguito, per cui ci sono 2 set di staffe vengono passati al metodo .:

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

quale concetto è stato impiegato all'interno c: Transaction?

leggerò ulteriormente una volta che so cosa sto cercando!

Grazie

+11

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

+5

Suggerimento: passa il mouse sopra il "tag Scala" e fai clic sul collegamento ["informazioni"] (http://stackoverflow.com/tags/scala/info). Il termine qui è "Multiple parameter lists". –

+0

Possibile duplicato di [Due modi di curry in Scala; qual è il caso d'uso per ciascuno?] (http://stackoverflow.com/questions/4915027/two-ways-of-currying-in-scala-whats-the-use-case-for-each) – DJ180

risposta

11

Questo si chiama Currying. Una funzione al curry è quando ha il tipo A => B => C.

La funzione def foo(a: A, b: B): C ha il tipo (A, B) => C. D'altra parte, la funzione def curriedFoo(a: A)(b: B): C ha il tipo A => B => C. Con la funzione al curry puoi fare def curriedFooWithA = curriedFoo(a) che ha il tipo B => C. Non devi fornire tutte le argomentazioni in una volta.

Quindi, nel tuo caso puoi fornire amount, a e b. Otterrai una funzione prendendo uno Transaction. Un altro caso potrebbe essere una funzione del tipo Request => DataBase => Int, in cui è sufficiente fornire lo Request e, infine, quando è realmente necessario eseguire la richiesta, fornire lo DataBase a cui deve essere inviata la richiesta.

Il tipo (A, B) => C e A => B => C sono isomorfi. Scala fornisce tupled e uncurried che fanno proprio questo.

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

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

Problemi correlati