Scala Parallel Seq并没有与Seq相提并论

时间:2016-06-28 23:14:38

标签: scala parallel-processing

我对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))
                 ^ 

如果ParSeqSeq的子类型,那么为什么这不起作用?

(正如我写的那样,我意识到要修复它我可以在结果上调用.seq方法,但为什么我必须这样做?以及.toSeq之间的区别是什么?告诉我是多余的.seq似乎有用了)

2 个答案:

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

  

如果ParSeqSeq的子类型,为什么这不起作用?

不是。 ParSeqGenSeq的子类型,这不是一回事。不同之处在于,当您拥有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