【问题标题】:Scala Parallel Seq not confroming to SeqScala Parallel Seq 不符合 Seq
【发布时间】:2016-06-28 23:14:37
【问题描述】:

我对 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 方法,但为什么我必须这样做?IDE 告诉我的 .toSeq 和 @ 之间有什么区别? 987654326@ 这似乎有效)

【问题讨论】:

    标签: scala parallel-processing


    【解决方案1】:

    我正在查看 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 说它是多余的。

    【讨论】:

    • 好的,我看到了 toSeq 与 seq。而且我想我误解了 GenSeq 和 Seq 之间的区别。但是文档确实说“并行序列继承了 Seq 特征”所以我仍然很困惑
    • 第一行....我错过了。我认为这是文档中的一个错误,它的意思是“并行序列继承了 GenSeq 特征”。 m-z 的答案说明了为什么 ParSeq 不能扩展 Seq
    【解决方案2】:

    如果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

    【讨论】:

    • 我完全理解答案,但在 Scala 库 2.11.8 中我们有以下内容:trait ParSeq[+T] extends scala.collection/*.immutable*/.GenSeq[T] with scala.collection.parallel.ParSeq[T] with ParIterable[T] with GenericParTemplate[T, ParSeq] with ParSeqLike[T, ParSeq[T], scala.collection.immutable.Seq[T]] { override def companion: GenericCompanion[ParSeq] with GenericParCompanion[ParSeq] = ParSeq override def toSeq: ParSeq[T] = this } 所以 ParSeq 混合在 Seq 中。还是我错了?
    • @longliveenduro SeqParSeqLike mixin 中的类型参数之一,但ParSeq 不会直接将其混入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2017-04-13
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多