2012-11-25 10 views
23

Scala'da yeniyim ve ScalaSTM çevresinde bazı okumalar yapıyorum.Bu Scala yöntem tanımında neden iki dizi bağımsız değişken/parantez var?

birisi basitçe aşağıdaki kavram sayabilirim ben takdir ediyorum, parantez 2 takım yöntemine .:

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

nasıl bir konsept c: Transaction içinde istihdam ediliyor orada geçirilen bu sayede?

Ne aradığımı öğrendiğimde daha fazla okuyacağım!

Teşekkür

+11

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

+5

İpucu: "Scala etiketi" nin üzerine gelin ve ["bilgi" bağlantısını] tıklayın (http://stackoverflow.com/tags/scala/info). Buradaki terim "Çoklu parametre listeleri" dir. –

+0

Olası iki kopyası [Scala'da iki körleme yolu; Her biri için kullanım durumu nedir?] (http://stackoverflow.com/questions/4915027/two-ways-of-currying-in-scala-whats-the-use-case-for-each) – DJ180

cevap

11

Bu Currying adlandırılır. Bir curried işlevi, A => B => C olduğunda, def foo(a: A, b: B): C(A, B) => C türüne sahiptir. Diğer taraftan, def curriedFoo(a: A)(b: B): C işlevi A => B => C türüne sahiptir. Curried işlevi ile B => C türüne sahip def curriedFooWithA = curriedFoo(a) yapabilirsiniz. Tüm tartışmayı bir seferde vermek zorunda değilsiniz.

Durumunuza göre, amount, a ve b'u sağlayabilirsiniz. Transaction alarak bir işlev alırsınız. Başka bir durum, Request => DataBase => Int türünün, Request'u sağladığınız ve isteğin gerçekten çalıştırılması gerektiğinde, isteğin gönderilmesi gereken DataBase değerini sağlamasının bir işlevi olabilir.

tip (A, B) => C ve A => B => C izomorfik. Scala, sadece bunu yapan tupled ve uncurried sağlar.

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

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

İlgili konular