Каков идиоматический способ интерпретации соответствия последовательностей?
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
стандартной библиотеки?
Ответы
Ответ 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