Es posible en la scala de especializarse en las condiciones en el interior de un if dentro de un para la comprensión? Estoy pensando que a lo largo de las líneas de:

val collection: SomeGenericCollection[Int] = ...

trait CollectionFilter
case object Even extends CollectionFilter
case object Odd extends CollectionFilter

val evenColl = for { i <- collection if(Even) } yield i
//evenColl would be a SomeGenericEvenCollection instance

val oddColl = for { i <- collection if(Odd) } yield i
//oddColl would be a SomeGenericOddCollection instance

Lo esencial es que al ceder i, me sale una nueva colección de potencial de un tipo diferente (por lo tanto me refiero a ella como la «especialización»)- frente a sólo un filtrado una versión de la misma GenericCollection tipo.

La razón que pido es que vi algo que yo no podía entender (un ejemplo puede ser encontrado en la línea 33 de la presente ScalaQuery ejemplo. Lo que hace es crear una consulta de una base de datos (es decir,SELECT ... FROM ... WHERE ...), donde me esperaban para iterar sobre los resultados de dicha consulta.

  • Esta pregunta no tiene mucho sentido. Voy a responder a lo que yo creo que es una pregunta, pero intentaré mejorar.
  • ‘expresiones’ debe ayudar.
  • He añadido un poco para tratar de aclarar la cuestión, a pesar de que parece ser correcto en su forma de pensar acerca de lo que estaba pidiendo.
InformationsquelleAutor Dylan | 2011-10-31

2 Comentarios

  1. 50

    Así, creo que se están preguntando si es posible que el if declaración en una comprensión de cambiar el tipo de resultado. La respuesta es «sí, pero…».

    Primero, entender cómo para la comprensión se expanden. Hay preguntas aquí sobre el Desbordamiento de la Pila de discutirlo, y hay parámetros se pueden pasar al compilador para que se muestre lo que está pasando.

    De todos modos, este código:

    val evenColl = for { i <- collection if(Even) } yield i

    Se traduce como:

    val evenColl = collection.withFilter(i => Even).map(i => i)

    Por lo tanto, si el withFilter cambios en los métodos de la colección tipo, va a hacer lo que queramos, en este caso simple. En los casos más complejos, que por sí sola no funciona:

    for {
      x <- xs
      y <- ys
      if cond
    } yield (x, y)

    se traduce como

    xs.flatMap(ys.withFilter(y => cond).map(y => (x, y)))

    En cuyo caso flatMap es decidir qué tipo será devuelto. Si se toma el ejemplo de lo que el resultado fue devuelto, entonces se puede trabajar.

    Ahora, en la Scala de las Colecciones, withFilter no cambia el tipo de la colección. Usted puede escribir sus propias clases que iba a hacer eso, sin embargo.

    • Gracias, creo que withFilter era la clave de la información que me faltaba.
  2. 5

    sí se puede – por favor, consulte este tutorial para un ejemplo fácil. La scala de consulta ejemplo citado es también la iteración en la colección, es, a continuación, utilizar esos datos para construir la consulta.

Dejar respuesta

Please enter your comment!
Please enter your name here