在2.8.1 / 2.9.0.1 REPL中尝试以下内容,第一个给出错误。
val l = List(Vector(1,2), List(3,4,5))
error: type mismatch;
found : scala.collection.immutable.Vector[Int]
required: scala.collection.immutable.Seq[Int]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]; protected def thisCollection: Seq[Int]{def companion: scala.collection.generic.GenericCompanion[Seq[Any]]}; def dropRight(n: Int): scala.collection.immutable.Seq[Int]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def takeRight(n: Int): scala.collection.immutable.Seq[Int]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def slice(start: Int,end: Int): scala.collection.immutable.Seq[Int]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable....
val l = List(Vector(1,2), List(3,4,5))
^
:5: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Seq[Int]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]; protected def thisCollection: Seq[Int]{def companion: scala.collection.generic.GenericCompanion[Seq[Any]]}; def dropRight(n: Int): scala.collection.immutable.Seq[Int]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def takeRight(n: Int): scala.collection.immutable.Seq[Int]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def slice(start: Int,end: Int): scala.collection.immutable.Seq[Int]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def take(n: Int):...
val l = List(Vector(1,2), List(3,4,5))
^
虽然这成功了:
val l = List[Seq[Int]](Vector(1,2), List(3,4,5))
//evaluates fine to List[Seq[Int]] = List(Vector(1, 2), List(3, 4, 5))
scala在第一种情况下试图推断的类型是什么?它是具有结构类型的Seq吗?为什么它不能统一Vector和List?这是否有一些缺失的功能,还是这样(需要明确的类型def)以防止自己在脚下射击?
答案 0 :(得分:7)
这显然是类型推理器中的一个错误,现在已经
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) Server VM, Java 1.6.0_18).
Type in expressions to have them evaluated.
Type :help for more information.
scala> import collection.immutable._
import collection.immutable._
scala> List(Vector(1, 2, 3), List(4, 5))
res0: List[scala.collection.immutable.Seq[Int]] = List(Vector(1, 2, 3), List(4, 5))
答案 1 :(得分:0)
根据daniel的回答here,Scala不使用Hindley-Milner类型推理,而是进行局部类型推断,从左向右移动。
在你的第一个声明中,第一个列表成员是Vector[Int]
,所以Scala说“好吧我有List[Vector[Int]]
但是当它到达第二个列表元素时,List[Int]
,它无法将此与Vector[Int]
统一起来。泛型必须是推理器的问题,因为包含数字和字符串的列表可以正确推断为List[Any]
。
相关内容:向量和列表可以在==
运算符的2.9.0.1中互操作。
scala> List[Int](1,2,3) == Vector[Int](1,2,3)
res2: Boolean = true
scala> List[Int](1,2,3) == Vector[Int](1,12,3)
res3: Boolean = false