2012-06-01 4 views

答えて

10

teleological答えは、containsSeqLikeに定義されていますが、ParSeqLikeに定義されていないためです。

それはあなたの好奇心を満たしていない場合、あなたはSeqLikecontainsがこのように定義されていることを見つけることができます:

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

だからあなたたとえば、あなたが

List.range(0,100).par.exists(_ == 2) 

ParSeqLikeを書くことができますがありません(indexOfSliceなど)、あまり明白ではないものがいくつかあります(例:combinations - 小規模なデータセットでのみ有効です)。 、私は完全に推測している...ライブラリの設計者はそれを左理由については

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

を:あなたは、並列コレクションを持っている場合しかし、あなたはまた、線形のバージョンに戻って取得するために.seqを使用し、戻ってあなたの方法を得ることができますおそらく単純化のためにメソッドの数を減らしたいと思っていたかもしれませんし、existsを使うのと同じくらい簡単です。

これはまた、なぜcontainsSeqLikeではなく、あなたがexistsを見つけるすべてのコレクションの祖父、GenTraversableOnce、上で定義された質問を、提起しますか?考えられる理由は、Mapcontainsが、SetSeqの場合と意味的に異なる方法です。 Map[A,B]Traversable[(A,B)]であるため、Traversableに対してcontainsが定義されている場合、containsはタプル(A,B)引数を取る必要があります。 Mapcontainsは、A引数をとるだけです。これを考えると、私はcontainsGenSeqLikeに定義する必要があります - これは修正される見込みです。

(パラレルコレクションでターゲットを見つけた後でどこを検索するのがリニアバージョンよりも効率が悪いので、並列シーケンスにはcontainsがないと考えました(さまざまなスレッドは多くの不必要な作業を行います値が見つかった後:this questionを参照してください)、existsが存在するため、これは正しいとは限りません。

+0

'indexOfSlice'は並列配列に順序があるので意味があります。注文。しかし、効率的でスケーラブルな 'indexOfSlice'はまだ実装されていません。 – axel22

+0

@ axel22ありがとう、更新しました。 –

+0

ありがとう非常に役立ちます!私は、あなたがそれを期待しているように機能しない、つまりある値を見つけるとすぐに戻るため、まだ実装していないと思います。 – placeybordeaux

関連する問題