Saltar a contenido

Sesión 07: Listas II

Tuplas

Son colecciones de datos que se pueden utiliza para patrones, estas pueden contener 2 o más elementos

val tupla = (1,2,3,4)
//Sumar dos vectores
def sumaVec(a:List[Int], b:List[Int]): List[Int] = {
    a match {
        case Nil => Nil
        case x:xs => {
            b match {
                case Nil => Nil
                case y:ys => x+y :: sumaVec(xs,ys)
            }
        }
    }
}

def sumaVec(a:List[Int], b:List[Int]): List[Int] = {
    (a,b) match {
        case (Nil,Nil) => Nil
        case (x:xs, y:ys) =>
            x+y :: sumaVec(xs,ys)
        case _ => error
    }

Funciones de alto orden

Map

Aplica una función a todos los elementos de una lista, la función debe aceptar un sólo argumento y su salida debe ser igual tipo de la lista

val l = List(1,2,3,4)
l.map(x => x*2)

Filter

Aplica a función a todos los elementos de una lista retorna aquellos que cumplen condición (función predicado, es una función que le ingresa un elemento y retorna un booleano)

val l = List(1,2,3,4,5)
l.filter(x => x > 3)

Reduce

Función que aplica una operación entre los elementos de una colección y nos retorna un elemento

val l = List(1,2,3,4,5)
l.reduce( (acc,x) => acc + x, 0)

ReduceLeft (((((1 + 2) + 3) + 4) + 5)

ReduceRight (1 + (2 + (3 + (4 + 5))))

Para que de lo mismo la operación debe ser asociativa


FoldLeft

FoldRIght

Son operaciones de reducción, son operaciones que reciben dos o más colecciones y nos permiten combinarlas

  • Fold recibe inicialmente al acumulador y me retorna una función que espera la función de reducción (dos parametros x, acc)
  • La función retornada la evaluamos con la función de reducción
val l = List(1,2,3)

l.foldLeft(0)_ //Retorna una función que espera una función
l.foldLeft(0)((x,acc) => x + acc)

//¿Cual es la diferencia entre reduceLeft y reduceRight)
//La forma de asociar
//ReduceLeft ((primer op segundo) op tercero) .. op acc)
//ReduceRight (primer op (    ...     (penultimo op (ultimo op acc)) ...)