2012-04-08 6 views
6

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

+2

Es un error en el emparejador: hay muchas entradas al respecto, y debería funcionar comenzando con Scala 2.10.x. –

+0

¿tiene un enlace al boleto para que yo pueda elegirlo como respuesta? – ilcavero

+1

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. –

Respuesta

1

Es un error en el matcher;?) El comparador de patrón está siendo (ha sido) rewritten de 2.10

acabo de comprobar con la última noche y su el código funciona como se esperaba:

Welcome to Scala version 2.10.0-20120426-131046-b1aaf74775 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_31). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> def typeErause1(a: Any) = a match { 
    |  case x: List[String] => "stringlists" 
    |  case _ => "uh?" 
    | } 
warning: there were 2 unchecked warnings; re-run with -unchecked for details 
typeErause1: (a: Any)String 

scala> def typeErause2(a: Any) = a match { 
    |  case List(_, _) => "2lists" 
    |  case x: List[String] => "stringlists" 
    |  case _ => "uh?" 
    | } 
warning: there were 3 unchecked warnings; re-run with -unchecked for details 
typeErause2: (a: Any)String 

scala> typeErause1(List(2,5,6)) 
res0: String = stringlists 

scala> typeErause2(List(2,5,6)) 
res1: String = stringlists 
Cuestiones relacionadas