Будет ли распаковка кортежей напрямую поддерживаться в списках параметров в Scala? - PullRequest
10 голосов
/ 19 июня 2011

В Haskell вы можете написать:

x :: (Int,Int) -> Int
x (p,s) = p

В Scala вы можете написать:

def x(a: (Int, Int)) = a._1

или:

def x(a: (Int, Int)) = a match {
    case (p, s) => p
}

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

def x(_: (p: Int, s: Int)) = p

или

def x(foo: (p @ Int, s @ Int)) = p

?

Ответы [ 4 ]

11 голосов
/ 19 июня 2011

Функция, которую вы ищете, называется destructuring и в общем виде выходит далеко за рамки простой распаковки кортежей.Я часто ловил себя на том, что желаю, чтобы это было в Scala, поскольку это такое естественное расширение синтаксиса сопоставления с образцом:

def first((f: Int, l: Int)) = f
def displayName(Person(first, last)) = last + ", " + first

Деструктурирование (вроде) присутствует в виде переменной/ значения:

val (f, l) = tuple
val Person(first, last) = person

К сожалению, существуют некоторые тип безопасность проблемы вокруг таких определений, которые, я думаю, делают вас маловероятным, что выскоро мы увидим разрушение в списках параметров.

4 голосов
/ 19 июня 2011

Вы можете создать функцию, которая получает список аргументов, соответствующий типам кортежа, применить Function.tupled к этой функции и затем применить кортеж:

scala> def fun(x:Int,y:Int)=x+y
fun: (x: Int,y: Int)Int

scala> val tuple = (1,2)
tuple: (Int, Int) = (1,2)

scala> Function.tupled(fun _)(tuple)
res9: Int = 3

Таким образом вы добьетесь правильного решения вашей проблемы

2 голосов
/ 19 июня 2011

Это называется множественной диспетчеризацией, и она не поддерживается JVM. Scala может переписать метод, чтобы сделать явное совпадение ненужным, но это не является приоритетом - или, насколько я знаю, даже запланированным - сделать это.

Интересно, что он поддерживается для функций, в некотором смысле, с ограничением на то, что все варианты должны появляться вместе. Например:

def x: ((Int, Int)) => Int = {
    case (p, _) => p
}
0 голосов
/ 19 июня 2011

Другим подходом было бы сделать списки параметров и кортежи одинаковыми в языке.

...