2011-07-15 17 views
15

Próbuję zbudować listę zestawów (zmienne i niezmienne). Kompilator wpada w kłopoty, ponieważ nie może określić typu tej listy. Zawsze myślałem, że mogę połączyć listy dowolnych typów i że typ nowej listy jest rodzajem nadtypu połączonych list. W poniższym przykładzie definiuję niektóre listy. Widać rodzaje tych wykazach, podane przez kompilator:Jak uzyskać listę zestawów (niezmiennych i zmiennych) w scala?

val intList = List(1) //List[Int] 
val stringList = List("ab") //List[java.lang.String] 
val mSetList = List(mutable.Set(1, 2, 3)) //List[scala.collection.mutable.Set[Int]] 
val iSetList = List(immutable.Set(1, 2, 3)) //List[scala.collection.immutable.Set[Int]] 

Teraz użyć operatora ::: łączenia tych list:

val intStringList = intList:::stringList //List[Any] 
val intMSetList = intList:::mSetList //List[Any] 
val intISetList = intList:::iSetList //List[Any] 

Zgodnie z oczekiwaniami, kompilator oblicza wspólny supertypem (List[Any]) z obu list. Ale dodaje się nie kompiluje:

val iSetmSetList = iSetList:::mSetList //type error 

ale gdybym wyraźnie „cast” dwie listy, to działa:

val setList1 : List[scala.collection.Set[Int]] = mSetList //List[scala.collection.Set[Int]] 
val setList2 : List[scala.collection.Set[Int]] = iSetList // List[scala.collection.Set[Int]] 
val setList = setList1:::setList2 //List[scala.collection.Set[Int]] 

Dlaczego muszę pomóc kompilatora, aby uzyskać prawidłowy typ że lista? I dlaczego powoduje błąd, a nie po prostu wpisuje go pod numerem List[Any]? Czy teoretycznie niemożliwe jest obliczenie typu List[scala.collection.Set[Int]], czy jest to rodzaj błędu w kompilatorze?

dziękuję za odpowiedzi :-)

+4

To sprawia, że ​​myślę o http: // stackoverflow. com/questions/5734755/scala-type-wideening-inference-of-foott-tt, który został naprawiony za pomocą https://issues.scala-lang.org/browse/SI-4501. Czy warto spróbować z wieczornym nowszym brzmieniem niż 6/25? – huynhjl

Odpowiedz

5

To był błąd, i jest ustalona w wersjach nocnych, jak huynhjl podejrzewał:

Welcome to Scala version 2.10.0.r25234-b20110705020226 
    (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24) 
Type in expressions to have them evaluated. 
Type :help for more information. 
. . . 
scala> val iSetmSetList = iSetList:::mSetList //type error 
iSetmSetList: List[scala.collection.Set[Int]] = List(Set(1, 2, 3), Set(2, 1, 3)) 
Powiązane problemy