Saltar a contenido

Sesion 09: Repaso de conceptos de PF

Introducción a la programación funcional


¿Que es la programación funcional?

  • Es un paradigma de programación
  • Las variables son inmutable
  • Se trabaja bajo el concepto de entrada y salida
  • Las funciones son consideradas valores

Tipos de evaluación

  • Valor: Se calculan los valores antes de invocar la función se declaran con val
  • Nombre: Se calculan los valores únicamente cuando se requieren con def
def a(a:Int, b=>Int) ...

Bloques

  • Se ejecutan secuencialmente, pero retorna el último valor
{
    1+2
    2+3
    3+4
    5+6
}

//Este bloque va a retorna 11

Diseño de programas en PF

  • Se agrupan las funciones con entradas comunes (que se pueden obviar) dentro un alcance lexico
def f(x:Int) = {
    def g(y:Int) = x+y
    def h(x:Int, z:Int) = x+z
  g(x) + h(x+2,x)
}
f(10)

//20 + 22 = 42
  • Se prefiere currificar las funciones

Currificación

  • Diseño funcional buscando que las funciones sólo reciban un argumento
  • Es especialmente util para la abstracción funcional (Racional) para expresar operaciones BINARIAS
def suma(a:Int, b:Int):Int = a+b

def sumaC(a:Int)(b:Int):Int = a+b

suma(1,2)
sumaC(1)(2

Recursión

Recursión lineal

Cuando una función se llama a sí misma, los llamados se van apilando en la pila

def factorial(n:Int):Int = {
    if (n==0) 1
    else n*factorial(n-1)
}

/*
factorial(5)
5*factorial(4) //Pila
4*factorial(3) //Pila
...
1*factorial(0) //Pila

Recursión de cola / Tail recursion

  • Solo se almacena un llamado a la pila
  • Se usan acumuladores para tener los resultados parciales
  • NO TODOS LOS LENGUAJES optimizan la recursión
  • Es equivalente a tener un ciclo ITERATIVO
@tailrec
def factorial(n:Int, acc:Int=1) {
    if (n == 0) acc
    else factorial(n-1, n*acc)
}

Recursión de árbol

Ya involucra dos o más llamados recursivos, no es facil de convertir en recursión de cola

def fib(n:Int):Int = {
    if (n <= 1) n
    else fib(n-1)+fib(n-2)

}

Funciones de alto orden

¿Que son?

Son funciones que reciben o retornan funciones

def f(g:Int=>Int, h:Int):Int = {
    g(h)
}

def x(a:Int):Int=>Int = {
    ...
}

x(3) //Funcion
x(3)(10) //Int

Funciones anonimas

Funciones que se declaran directamente valores

(x:Int) => x+2
f(w:Int=>w+2, 5)

Abstracción de datos

¿Que es?

Nos permite trabajar datos complejos sin preocuparnos como funcionan internamente

Ejemplo de racional

Racional(10,2) // 10/2 5/1
Racional(10,0) // Error, assert
Racional(10,-3) // Error, require

println(Racional(8,3)) // 8/3
/**
Se modifica 
override
def toString():

Es un método hereado desde Any (object) para representar los objetos
**/

Operaciones binarias

Importancia de la currificación

¿Porque funciona?

val a = new Racional(4,3)
val b = new Racional(2,5)

a.suma(b)
a.+(b)

a + b
a suma b
new Racional(78,2) ....
....
this
.....

Colecciones

Listas

¿Que son las listas?

Son agrupaciones de elementos del mismo tipo y son inmutables

Son naturalmente recursivas

  • Caso base: Lista vacia: empty
  • Caso recusivo: Cabeza: Elemento, Cola. Lista
val l = List(1,2,3)
l.head //1
l.tail //List(2,3)
l.tail.head

l.splitAt(n) // 0..n-1, n ... final
l.take(n) //retorna los primeros n elemento
l.drop(n) //elimina los primeros n elemento

Tuplas

¿Que son?

  • Son agrupaciones de elementos indexados desde 1 tambien son inmutables
val b = (1,2,3)
b._1
b._2
b._3

Rangos

¿Que son?

Son secuencias de valores enteros

//Inclusivo
a to b
//Exclusivo
a until b
// Cambiamos el incremeto
a to b by c

Arreglos

¿Que son? ¿COmo se diferencian de los demas?

Son reservas de espacio en memoria continuos, no pueden crecer dinámicamente, pero son mutables

Reconocimiento de patrones

¿Que podemos reconocer?

  • Clases
  • Colecciones
trait Conjunto() ...
class ConjuntoV() extends Conjunto
class ConjuntoNV() extends Conjunto

trait Conjunto()
case class ConjuntoV() extends Conjunto
case class ConjuntoNV() extends Conjunto

Reconociendo case classes

elm match {
    case ConjuntoV() => ...
    case COnjuntoNV(..) => ...
    case _ => ....
}

Reconocimiento colecciones

em match {
    case x::xs => ...
    case List() => ..
    case 1::xs => ...
}
(a,b) match {
    case (x::xs, y::ys) => ...
    case (List(), y::ys) => ....
}

Funciones de alto orden

  • map: Aplica una función a una colección, por ejemplo, elevar al cuadrado
  • filter: Retorna los elementos que cumplen una condición (función que ingresa)
  • reduceLeft: Retorna un valor al aplicar una operacion a una coleccion, no se aceptan colecciones vacia primero con segundo, luego tercero y así
  • reduceRight: Lo mismo, pero ultimo con penultimo, luego con antepenultimo, …
  • foldLeft Reduce con acumulador