mexicanas las ingles idiomáticas idiomaticas frases frances expresiones ejemplos diccionario caracteristicas scala pattern-matching for-comprehension

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)