Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Programación Funcional

Programación Funcional

Introducción a la programación funcional con Scala.

Carlos Alberto Borda Benito

December 14, 2018
Tweet

Other Decks in Programming

Transcript

  1. LA PROGRAMACIÓN IMPERATIVA La programación imperativa es uno de los

    paradigmas de programación de computadoras más generales, que describe la programación en términos del estado del programa y sentencias que cambian dicho estado. Los programas imperativos son un conjunto de instrucciones que le indican al computador cómo realizar una tarea, de la misma manera que el modo imperativo en los lenguajes naturales humanos le dice qué hacer al interlocutor. Fuente: https://es.wikipedia.org/wiki/Programación_imperativa
  2. PROGRAMACIÓN FUNCIONAL Es un paradigma de programación declarativa basado en

    el uso de funciones matemáticas, en contraste con la programación imperativa, que enfatiza los cambios de estado mediante la mutación de variables. La programación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en los años 1930 para investigar la definición de función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación funcionales pueden ser vistos como elaboraciones del cálculo lambda. Fuente: https://es.wikipedia.org/wiki/Programación_funcional
  3. INMUTABILIDAD La inmutabilidad o estado inmutable se refiere los datos

    dentro un objeto no pueden ser modificados una vez que este ha sido creado. Claro, no siempre es posible utilizar estados inmutables pero siempre es recomendable diseñar los programas tomando en cuenta este punto. Var y Val case class Car(color: String model: String brand: String year: Date)
  4. FUNCIONES PURAS Típicamente, una función acepta unos valores de entrada,

    los procesa y produce una salida. El problema con las funciones estándar (más aún cuando quien las programó, no ha seguido ningún paradigma formal específico) es que no podemos garantizar que el resultado producido sea siempre el mismo para los mismos valores de entrada. En otras palabras, no garantizan que al llamar a la función con los mismos parámetros, el resultado sea consistentemente igual, agregando una innecesaria incertidumbre y complejidad a la lógica del código. 1. Dados los mismos parámetros de entrada, debe retornar +siempre+ el mismo valor de salida, sin importar cuántas veces se llame. 2. La función NO debe tener efectos colaterales (o secundarios); es decir, no debe tener ningún otro efecto en el entorno, aparte del cálculo del resultado. def sin(value: Double): Double
  5. FUNCIONES DE ORDEN SUPERIOR Las funciones de orden superior son

    funciones tiene la particularidad de tener un gra uso matematico y tambien en las ciencias de la computacion: • Tomar una o más funciones como entrada • Devolver una función como salida type func = Int => Int def f (x:Int): Int = x+3 def g (fu: func , x:Int) = { fu(x)*fu(x) } println ("Calculo : "+g(f,7))
  6. PATTERN MATCHING Pattern Matching es un mecanismo de la programación

    funcional, que nos permite comprobar un valor contrastando contra un patrón. Está presente en muchos lenguajes que no son puramente funcionales. Pattern Matching es una secuencia de alternativas, donde cada alternativa implementa un patrón y una o mas expresiones que serán evaluadas si el patrón se cumple. def ejemploCalculadora(x: Char) = x match { case '+' => "Suma" case '-' => "Resta" case _ if Character.isDigit(x) => "Digito" case _ => "Cualquiera" } abstract class Vehiculo case class Coche() extends Vehiculo case class Bicicleta() extends Vehiculo def elegirVehiculo(x: Vehiculo): String = x match { case a: Coche => "Mi objeto es un coche" case b: Bicicleta => "Mi objeto es una bicicleta" }
  7. MONADS Los Monads son otra parte clave de la Programación

    Funcional. Por definición un Monad es una interface, que simplemente especifica una forma para la composición de los datos. class Monad[A](value: A) { // recibe una función 'f' que transforma cualquier valor 'A' en valor 'B' def map[B](f: A => B): Monad[B] = new Monad(f(value)) // recibe una función 'f' que transforma cualquier valor 'A' en otra 'Mónada [B]' def flatMap[B](f: A => Monad[B]): Monad[B] = f(value) } val firstMonad = new Monad(4) val secondMonad = new Monad(6) val resultingMonad = firstMonad.flatMap { x => secondMonad.map { y => y + x } } // returns: Monad[Int] = 10