scala - las - ¿Cuál es la forma idiomática de hacer coincidir patrones de comprensión de secuencias?
expresiones idiomáticas ejemplos (2)
val x = for(i <- 1 to 3) yield i
x match {
case 1 :: rest => ... // compile error
}
no se puede crear una instancia del constructor al tipo esperado; encontrado: collection.immutable.::[B] requerido: scala.collection.immutable.IndexedSeq [Int]
Este es el mismo problema que MatchError cuando match recibe un IndexedSeq pero no un LinearSeq .
La pregunta es, ¿cómo hacerlo bien? Agregar .toList
todas partes no parece correcto. Y crear un extractor propio que maneje cada Seq
(como se describe en la respuesta de la otra pregunta) llevaría a un desastre si todos lo hicieran ...
Supongo que la pregunta es, ¿por qué no puedo influir en el tipo de comprensión de secuencia de retorno o por qué un extractor de Seq
tan generalizado no forma parte de la biblioteca estándar?
Bueno, puedes hacer un patrón de cualquier secuencia:
case Seq(a, b, rest @ _ *) =>
Por ejemplo:
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
Entonces esto coincidirá con cualquier secuencia con más de (o igual a) 2 elementos
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
Una solución más para Vector en REPL:
Vector() match {
case a +: as => "head + tail"
case _ => "empty"
}
res0: String = "empty"
Vector(1,2) match {
case a +: as => s"$a + $as"
case _ => "empty" }
res1: String = 1 + Vector(2)