Saltar a contenido

Logicas

En algunas situaciones vamos a necesitar evaluar si todos los elementos de un arreglo o bien al menos uno cumplen un condicion

\[ \forall P(x), \exists P(x) \]
scala> Array(1,2,3,4) forall (_ < 5)
val res18: Boolean = true

scala> Array(1,2,3,4) forall (_ < 3)
val res19: Boolean = false

scala> Array(1,2,3,4) exists (_ < 3)
val res20: Boolean = true

scala> Array(1,2,3,4) exists (_ > 5)
val res21: Boolean = false

Ejemplo determinar números primos

// Define una función lambda que verifica si un número es primo
val f = (x : Int) => 
  // Para x, verifica que todos los números en el rango [2, sqrt(x)] 
  // no dividan exactamente a x (o que x sea <= 2)
  (2 to Math.ceil(Math.sqrt(x)).toInt) forall (t => 
    x % t != 0  // x no es divisible por t
    || x <= 2    // o x es 1 o 2 (casos especiales de primos)
  )

// Prueba la función con números del 1 al 20
// Crea una tupla (número, ¿es primo?) para cada número
(1 to 20) map (x => (x, f(x)))
// Resultado: Vector de tuplas donde true = primo, false = no primo

Empaquetamiento

Nos permiten manejar colecciones paralelas

scala> val temp = Array(10.2, 15.3, 18.9)
val temp: Array[Double] = Array(10.2, 15.3, 18.9)

scala> val ciudades = Array("Bogota", "Medellin", "Cali")
val ciudades: Array[String] = Array(Bogota, Medellin, Cali)

scala> temp zip ciudades
val res34: Array[(Double, String)] = Array((10.2,Bogota), (15.3,Medellin), (18.9,Cali))

scala> (temp zip ciudades).unzip
val res35: (Array[Double], Array[String]) = (Array(10.2, 15.3, 18.9),Array(Bogota, Medellin, Cali))