Доступны ли входные параметры деструктурирования в Scala?

Есть ли способ разрушить входные параметры функции в Scala (сродни Clojure)?

Итак, вместо

scala> def f(p: (Int, Int)) = p._1
f: (p: (Int, Int))Int

Я хотел бы иметь это (это не работает):

scala> def f((p1, p2): (Int, Int)) = p1

Ответ 1

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

val f: (Int, Int) => Int = { case (p1, p2) => p1 }

Или, что эквивалентно:

def f(p: (Int, Int)) = p match { case(p1, p2) => p1 }

Если типы могут быть выведены, (Int, Int) => Int можно отбросить:

List((1, 2), (3, 4)) map { case (p1, p2) => p1 }

Ответ 2

def f(p: ((Int, Int), (Int, Int))) = p._1     > f: (p: ((Int, Int), (Int, Int)))(Int, Int)
f((1,2), (3,4))                               > res1: (Int, Int) = (1,2)