Подтвердить что ты не робот

Почему в этом определении метода Scala есть два набора аргументов/скобок?

Я новичок в Scala и делаю некоторые чтения вокруг ScalaSTM.

Я был бы признателен, если бы кто-то мог просто назвать концепцию ниже, в результате чего к методу передаются 2 набора скобок.:

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?

Я буду читать дальше, как только узнаю, что я ищу!

Спасибо

4b9b3361

Ответ 1

Это называется Currying. Функция curried имеет тип A = > B = > C.

Функция def foo(a: A, b: B): C имеет тип (A, B) => C. С другой стороны, функция def curriedFoo(a: A)(b: B): C имеет тип A => B => C. С помощью функции curried вы можете сделать def curriedFooWithA = curriedFoo(a) с типом B => C. Вам не нужно предоставлять все аргументы за один раз.

Итак, в вашем случае вы можете предоставить amount, a и b. Вы получите функцию с Transaction. Другим случаем будет функция типа Request => DataBase => Int, где вы просто указываете Request, и, наконец, когда вам действительно нужно запустить запрос, укажите DataBase, на который должен быть отправлен запрос.

Тип (A, B) => C и A => B => C изоморфны. Scala предоставляет tupled и uncurried, которые делают именно это.

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

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