Рассмотрим этот пример:
scala> def mult = (x: Int, y: Int) => x * y
mult: (Int, Int) => Int
scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)
scala> list zip list map mult
<console>:10: error: type mismatch;
found : (Int, Int) => Int
required: ((Int, Int)) => ?
list zip list map mult
^
scala> list zip list map mult.tupled
res4: List[Int] = List(1, 4, 9)
Есть много ситуаций, когда вы заканчиваете соединением элементов в кортежах. В таких ситуациях вам нужна функция с кортежем для ее обработки. Но есть много других мест, где это не правда! Например:
scala> list.foldLeft(1)(mult)
res5: Int = 6
scala> list.foldLeft(1)(mult.tupled)
<console>:10: error: type mismatch;
found : ((Int, Int)) => Int
required: (Int, Int) => Int
list.foldLeft(1)(mult.tupled)
^
Таким образом, в сущности, в Scala существует дихотомия между кортежами и параметрами, что означает, что вы должны преобразовывать функции из кортежей в функции без кортежей и наоборот здесь и там.