¿Por qué¿Por qué las secuencias paralelas de Scala no tienen un método contains?
List.range(0,100).contains(2)
trabajo, mientras que
List.range(0,100).par.contains(2)
no lo hace?
Esto está planeado para el futuro?
¿Por qué¿Por qué las secuencias paralelas de Scala no tienen un método contains?
List.range(0,100).contains(2)
trabajo, mientras que
List.range(0,100).par.contains(2)
no lo hace?
Esto está planeado para el futuro?
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 contains
SeqLike
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í.)
'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
@ axel22 gracias, actualizado. –
¡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