Нет совпадения с шаблоном для Seq [Seq [T]] - PullRequest
0 голосов
/ 28 декабря 2018
def example1(sss:Seq[Seq[String]]) = sss match {
  case Seq(a, b) :+ Seq(c, d) :+ tail => true
}

val res1 = example1(Seq(Seq("a", "b"), Seq("c","d")))
// scala.MatchError: List(List(a, b), List(c, d)) 

Ну, у меня есть обходной путь, который должен использовать

case Seq(Seq(a, b), Seq(c, d), _*) => true

Кто-нибудь может объяснить, почему первый не работает?

1 Ответ

0 голосов
/ 28 декабря 2018

Вы используете неправильный экстрактор!:+ подразумевает, что первая часть является частью (внешнего) Seq, следовательно, a и b имеют тип Seq[String], а не String, в то время как вторая часть Seq(c,d) и tailрассматриваются как элементы, поэтому c и d на самом деле String.

Обычно это не проверка типа, но в случае, когда тип элемента равен Seq, это так.Однако если вы предполагаете, что a и b равны String, и попытаетесь обработать их как таковые, средство проверки типов может выразить недовольство, что приведет к еще большей путанице.

Правильный экстрактор - +:.Двоеточие идет на стороне последовательности, а плюс на стороне элемента.Следовательно,

  case Seq(a, b) +: Seq(c, d) +: tail => true

соответствует ожидаемому.

...