Estoy tratando de descubrir qué está pasando en este fragmento de código, tratando de averiguar si hay algo que no entiendo o si es un compilador error o especificaciones poco intuitivo, vamos a definir estas dos funciones casi idénticas:Mezclar coincidencias mecanografiadas con el secuenciador de secuencia da un comportamiento extraño en Scala
def typeErause1(a: Any) = a match {
case x: List[String] => "stringlists"
case _ => "uh?"
}
def typeErause2(a: Any) = a match {
case List(_, _) => "2lists"
case x: List[String] => "stringlists"
case _ => "uh?"
}
ahora si llamo typeErause1(List(2,5,6))
consigo "stringlists"
porque incluso si en realidad es List[Int]
con el tipo de borrado no es capaz de notar la diferencia. Pero, curiosamente, si llamo a typeErause2(List(2,5,6))
obtengo "uh?"
y no entiendo por qué no coincide List[String]
como lo hacía antes. Si utilizo List[_]
en su lugar en la segunda función, es capaz de hacer coincidir correctamente lo que me hace pensar que esto es un error en scalac.
estoy usando Scala 2.9.1
Es un error en el emparejador: hay muchas entradas al respecto, y debería funcionar comenzando con Scala 2.10.x. –
¿tiene un enlace al boleto para que yo pueda elegirlo como respuesta? – ilcavero
Como ya he dicho, hay muchas entradas sobre el emparejador, y realmente no estoy particularmente interesado en buscar el que cubre este caso en particular. –