7

なぜ

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

働きながら

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

ではない?

これは将来の予定ですか?

4

1 に答える 1

11

目的論的な答えは、 で定義されているcontainsが で定義されてSeqLikeいないためです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定義されているのかという疑問を提起します。考えられる理由は、forが意味的に onおよび とは異なるメソッドであることです。Aは であるため、に対して定義されている場合、タプル引数を取る必要があります。ただし、 は引数だけを取ります。これを考えると、で定義されるべきだと思います-多分これは修正される見落としです。SeqLikeGenTraversableOnceexistscontainsMapSetSeqMap[A,B]Traversable[(A,B)]containsTraversablecontains(A,B)MapcontainsAcontainsGenSeqLike

contains(最初は、並列コレクションでターゲットを見つけた後に停止する場所を検索するのは、線形バージョンよりもはるかに効率が悪いため、並列シーケンスにはないのではないかと思いました(値が見つかった後、さまざまなスレッドが多くの不要な作業を行います) :この質問を参照してください) exists

于 2012-06-01T01:58:48.893 に答える