Set
не case class
и не имеет метода unapply
.
Эти две вещи подразумевают, что вы не можете сопоставлять соответствие непосредственно на Set
.
(обновление: если вы не определить собственную экстрактор для Set
, так как Даниэль правильно показывает в своем ответе)
Вы должны найти альтернативу, я предлагаю использовать кратную функцию
def union(s: Set[Int], t: Set[Int]): Set[Int] =
(s foldLeft t) {case (t: Set[Int], x: Int) => t + x}
Это будет накапливать элементы s
над t
, добавляя их по одному
складного
Вот docs для кратных операций, если это необходимо для справки:
foldLeft[B](z: B)(op: (B, A) ⇒ B): B
Применяется бинарный оператором начального значения и всех элементам этого множества, идя слева направо.
Примечание: могут быть возвращены разные результаты для разных прогонов, если не будет заказан базовый тип коллекции. или оператор ассоциативен и коммутативен.
B the result type of the binary operator.
z the start value.
op the binary operator.
returns the result of inserting op between consecutive elements of this set, going left to right with the start value z on the left:
op(...op(z, x_1), x_2, ..., x_n)
where x1, ..., xn are the elements of this set.
Ницца. Чтобы быть понятным для Кевина: поскольку на наборах нет определенного порядка, вы должны * не * использовать SetExtractor с фактическими значениями, например. 'case SetExtractor (1, xs @ _ *) => ...'; он работает с 'Set (1,2,3)', но не будет работать вообще, например. с 'Set (1,2,3,4,5)'. Даниэль предлагает это как способ разрешить деконструкцию привязки для выбора произвольного элемента из набора. Также обратите внимание, что остаток, xs, является ArrayBuffer, поэтому, если вы хотите, чтобы он как набор использовал 'xs.toSet'. – AmigoNico