2012-06-01 16 views

Respuesta

10

La respuesta no teleological es que es porque contains se define en SeqLike pero no en ParSeqLike.

Si eso no satisfacer su curiosidad, se puede encontrar que SeqLike 's contains se define así:

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

Así que para su ejemplo, usted puede escribir

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

ParSeqLike falta una algunos otros métodos también, algunos de los cuales serían difíciles de implementar de manera eficiente (ej. indexOfSlice) y otros por razones menos obvias (ej. combinations - tal vez porque eso solo es útil en conjuntos de datos pequeños). Pero si usted tiene una colección paralela también se puede utilizar .seq para volver a la versión lineal y obtener sus métodos de vuelta:

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

cuanto a por qué los diseñadores de bibliotecas dejaron salir ... estoy totalmente de adivinanzas, pero tal vez querían reducir el número de métodos por simplicidad, y es casi tan fácil de usar exists.

Esto también plantea la pregunta, ¿por qué se define en containsSeqLike más que en el abuelo de todas las colecciones, GenTraversableOnce, donde se encuentran exists? Una posible razón es que contains para Map es semánticamente un método diferente al de Set y Seq. Un Map[A,B] es un Traversable[(A,B)], por lo que si se definió contains para Traversable, contains necesitaría tomar un argumento de tupla (A,B); sin embargo Map 's contains toma solo un argumento A. Teniendo esto en cuenta, creo que contains se debe definir en GenSeqLike - tal vez esto es un descuido que se corregirá.

(pensé al principio que las secuencias paralelas no tienen contains porque la búsqueda donde intenta detenerse después de encontrar su objetivo en colecciones paralelas es mucho menos eficiente que la versión lineal (los diversos hilos hacen un trabajo innecesario) después de encontrar el valor: vea this question), pero eso no puede ser correcto porque exists está allí.)

+0

'indexOfSlice' tendría sentido ya que las secuencias paralelas tienen orden, es solo que no ejecutan operaciones paralelas en orden. Pero aún no se ha implementado un 'indexOfSlice' eficiente y escalable. – axel22

+0

@ axel22 gracias, actualizado. –

+0

¡Gracias muy útiles! Supongo que simplemente aún no lo han implementado porque no funciona como esperaría, es decir, volver tan pronto como encuentre un valor. – placeybordeaux

Cuestiones relacionadas