2012-06-01 66 views

回答

10

teleological的答案是,這是因爲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定義在SeqLike而不是所有收藏的granddaddy,GenTraversableOnce,你在哪裏找到exists?可能的原因是Mapcontains在語義上與SetSeq的方法不同。 A Map[A,B]Traversable[(A,B)],所以如果contains被定義爲Traversable,contains將需要採取元組(A,B)變元;然而Mapcontains只需要一個A參數。鑑於此,我認爲contains應該在GenSeqLike中定義 - 也許這是一個將被糾正的疏忽。

(我以爲最初也許並行序列沒有contains,因爲在並行集合上找到目標後,搜索您要停止的位置比線性版本效率低很多(各種線程執行大量不必要的工作在找到該值後:請參閱this question),但這不可能是正確的,因爲exists在那裏。)

+0

'indexOfSlice'會有意義,因爲並行序列確實有序,只是它們不會執行並行操作訂購。但是一個高效的,可擴展的'indexOfSlice'尚未實現。 – axel22

+0

@ axel22謝謝,更新。 –

+0

非常感謝!我猜測他們根本沒有實現它,因爲它不像你期望的那樣工作,即一旦找到一個值就返回。 – placeybordeaux

相關問題