2012-11-25 23 views
23

Tôi mới sử dụng Scala và đang thực hiện một số bài đọc về ScalaSTM.Tại sao có hai bộ đối số/dấu ngoặc đơn trong định nghĩa phương thức Scala này?

tôi sẽ đánh giá cao nếu ai đó chỉ đơn giản là có thể đặt tên cho khái niệm dưới đây, trong đó có những 2 bộ khung được truyền cho phương pháp công trình .:

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

khái niệm gì đang được sử dụng trong vòng c: Transaction?

Tôi sẽ đọc thêm sau khi tôi biết những gì tôi đang tìm kiếm!

Cảm ơn

+11

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

+5

Gợi ý: di chuột qua "thẻ Scala" và nhấp vào liên kết ["thông tin"] (http://stackoverflow.com/tags/scala/info). Thuật ngữ ở đây là "Nhiều danh sách tham số". –

+0

Bản sao có thể có của [Hai cách làm curry trong Scala; trường hợp sử dụng cho mỗi trường hợp là gì?] (http://stackoverflow.com/questions/4915027/two-ways-of-currying-in-scala-whats-the-use-case-for-each) – DJ180

Trả lời

11

Đây được đặt tên Currying. Chức năng được thu thập là khi có loại A => B => C.

Chức năng def foo(a: A, b: B): C có loại (A, B) => C. Mặt khác, chức năng def curriedFoo(a: A)(b: B): C có loại A => B => C. Với chức năng curried bạn có thể làm def curriedFooWithA = curriedFoo(a) có loại B => C. Bạn không phải cung cấp tất cả các đối số trong một lần.

Vì vậy, trong trường hợp của bạn, bạn có thể cung cấp amount, ab. Bạn sẽ nhận được một hàm lấy Transaction. Một trường hợp khác sẽ là một chức năng của loại Request => DataBase => Int, nơi bạn chỉ cần cung cấp Request và cuối cùng là khi bạn thực sự cần chạy yêu cầu, hãy cung cấp số DataBase mà yêu cầu phải được gửi đi.

Loại (A, B) => CA => B => C là đẳng cấu. Scala cung cấp tupleduncurried để thực hiện điều đó.

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

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

Các vấn đề liên quan