我对Scala比较新,但我想我理解它的类型系统和并行集合,我无法理解这个错误:
我有一个功能
def myFun(a : Seq[MyType], b : OtherType) : Seq[MyType] = {
val parA = a.par
def update(q : OtherType)(x : MyType) : MyType = x.updated(q)
parA.map(update(b))
我收到错误消息
Error:(63, 18) type mismatch;
found : scala.collection.parallel.ParSeq[MyType]
required: Seq[MyType]
parA.map(update(b))
^
如果ParSeq
是Seq
的子类型,那么为什么这不起作用?
(正如我写的那样,我意识到要修复它我可以在结果上调用.seq
方法,但为什么我必须这样做?以及.toSeq之间的区别是什么?告诉我是多余的.seq
似乎有用了)
答案 0 :(得分:4)
我正在寻找docs并且无法看到ParSeq在哪里延伸Seq,我错过了什么?
至于问题的第二部分: toSeq返回一个ParSeq,seq返回一个Seq。 要明确:
val x: ParSeq[Int] = Seq(1,2,3).par
val y: ParSeq[Int] = x.toSeq
val z: Seq[Int] = x.seq
因为.toSeq没有做任何事情'你的IDE说它多余了。
答案 1 :(得分:4)
如果
ParSeq
是Seq
的子类型,为什么这不起作用?
不是。 ParSeq
是GenSeq
的子类型,这不是一回事。不同之处在于,当您拥有Seq
时,您希望所有操作按顺序进行,但使用ParSeq
时,情况不一定如此!
如果我有:
Seq(1, 2, 3, 4, 5) foreach println
我希望元素按照每次显示的顺序打印。 ParSeq
无法保证:
scala> ParSeq(1, 2, 3, 4, 5) foreach println
2
1
3
4
5
因此,如果我期待Seq
,而是得到具有上述行为的ParSeq
,则可能会导致一些令人讨厌的错误。如果您不关心并且可以处理这两种情况,请要求GenSeq
。