gpt4 book ai didi

scala - 为什么scala的并行序列没有包含方法?

转载 作者:行者123 更新时间:2023-12-04 14:03:56 25 4
gpt4 key购买 nike

为什么

 List.range(0,100).contains(2)

工作,同时
 List.range(0,100).par.contains(2)

才不是?

这是为 future 计划的吗?

最佳答案

teleological答案是因为containsSeqLike 中定义但不在 ParSeqLike .

如果这不能满足您的好奇心,您可以找到 SeqLikecontains定义如下:

def contains(elem: Any): Boolean = exists (_ == elem)

所以对于你的例子,你可以写
List.range(0,100).par.exists(_ == 2)
ParSeqLike还缺少一些其他方法,其中一些方法很难有效实现(例如 indexOfSlice ),而另一些则由于不太明显的原因(例如 combinations - 也许是因为这仅对小数据集有用)。但是如果你有一个并行集合,你也可以使用 .seq回到线性版本并恢复您的方法:
List.range(0,100).par.seq.contains(2)

至于为什么库设计者忽略了它......我完全是在猜测,但也许他们为了简单起见想减少方法的数量,而且它几乎同样易于使用 exists .

这也提出了一个问题,为什么是 contains定义于 SeqLike而不是所有收藏的祖父, GenTraversableOnce , 在哪里可以找到 exists ?一个可能的原因是 containsMap在语义上与 Set 上的方法不同和 Seq .一个 Map[A,B]Traversable[(A,B)] ,所以如果 contains定义为 Traversable , contains需要一个元组 (A,B)争论;然而 Mapcontains只需要一个 A争论。鉴于此,我认为 contains应该在 GenSeqLike 中定义- 也许这是一个将被纠正的疏忽。

(一开始我想也许并行序列没有 contains 因为在并行集合上找到目标后搜索打算停止的位置比线性版本效率低得多(各种线程在之后做了很多不必要的工作)找到值:见 this question ),但这不可能是正确的,因为 exists 在那里。)

关于scala - 为什么scala的并行序列没有包含方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10842974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com