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

Каков идиоматический способ интерпретации соответствия последовательностей?

val x = for(i <- 1 to 3) yield i
x match {
    case 1 :: rest => ... // compile error
}
Конструктор

не может быть создан для ожидаемого типа; найденный: collection.immutable.::[B] требуется: scala.collection.immutable.IndexedSeq [Int]

Это та же проблема, что и MatchError, когда match получает IndexedSeq, но не LinearSeq.

Вопрос в том, как это сделать правильно? Добавление .toList везде не кажется правильным. И создание собственного экстрактора, который обрабатывает каждый Seq (как описано в ответе на другой вопрос), приведет к беспорядку, если все это сделают...

Я предполагаю, что вопрос заключается в том, почему я не могу повлиять на то, что является обратным типом последовательных понятий, или: почему не является такой обобщенной частью экстрактора Seq стандартной библиотеки?

4b9b3361

Ответ 1

Ну, вы можете сопоставлять шаблоны любой последовательности:

case Seq(a, b, rest @ _ *) =>

Например:

scala> def mtch(s: Seq[Int]) = s match { 
  |      case Seq(a, b, rest @ _ *) => println("Found " + a + " and " + b)
  |      case _ => println("Bah") 
  |    }
mtch: (s: Seq[Int])Unit

Тогда это будет соответствовать любой последовательности с более чем (или равным) 2 элементам

scala> mtch(List(1, 2, 3, 4))
Found 1 and 2

scala> mtch(Seq(1, 2, 3))
Found 1 and 2

scala> mtch(Vector(1, 2))
Found 1 and 2

scala> mtch(Vector(1))
Bah