为什么scala的并行序列没有contains方法?

时间:2012-06-01 00:23:24

标签: scala parallel-processing scala-2.9

为什么

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

工作,而

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

不是吗?

这是为未来计划的吗?

1 个答案:

答案 0 :(得分:10)

teleological答案是因为containsSeqLike中定义,而在ParSeqLike中未定义。

如果这不能满足您的好奇心,您可以发现SeqLike的{​​{1}}已定义为:

contains

因此,对于您的示例,您可以编写

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?可能的原因是contains Map在语义上与SetSeq上的方法不同。 Map[A,B]Traversable[(A,B)],因此如果为contains定义Traversable,则contains需要使用元组(A,B)参数;但是Map的{​​{1}}只需要一个contains参数。鉴于此,我认为A应该在contains中定义 - 也许这是一个可以纠正的疏忽。

(我起初认为并行序列可能没有GenSeqLike,因为在并行集合上找到目标后搜索要停止的位置比线性版本效率低很多(各种线程做了很多事情)找到值后不必要的工作:请参阅this question),但这可能不对,因为contains就在那里。)