Как получить список (неизменяемых и изменяемых) наборов в 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]]

Теперь я использую оператор ::: для подключения этих списков:

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

Как и ожидалось, компилятор вычисляет общий супертип (List[Any]) обоих списков. Но следующее не компилируется:

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

Но если я явно "запустил" два списка, он работает:

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]]

Почему я должен помочь компилятору получить правильный тип этого списка? И почему это порождает ошибку, а не просто набирает ее с помощью List[Any]? Теоретически невозможно вычислить тип List[scala.collection.Set[Int]] или это какая-то ошибка в компиляторе?

Большое спасибо за ваши ответы: -)

Ответы

Ответ 1

Это была ошибка, и она исправлена ​​в ночных версиях, как подозревал huynhjl:

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))