Programación funcional en Java con            

Una mónada es solo un monoide en la categoría de endofunctores

Es el proceso de creación de software mediante la composición de funciones

Programación funcional

Es el proceso de creación de software mediante la composición de funciones

Programación funcional

El código funcional tiende a ser más conciso, más predecible y más fácil de probar

Vavr es una biblioteca funcional para Java 8+ que proporciona
tipos de datos y estructuras de control funcional

VAVR

Programación Funcional (conceptos basicos)

Lambda ...

Efectos secundarios

Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor

Efectos secundarios

Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor

  • Cambiar objetos o variables en el lugar

Efectos secundarios

Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor

  • Cambiar objetos o variables en el lugar
  • Imprimir en la consola

Efectos secundarios

Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor

  • Cambiar objetos o variables en el lugar
  • Imprimir en la consola
  • Escribir en un archivo

Efectos secundarios

Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor

  • Cambiar objetos o variables en el lugar
  • Imprimir en la consola
  • Escribir en un archivo
  • Escribir en una base de datos

Transparencia referencial

Una función o una expresión, se llama referencialmente transparente si una llamada puede ser reemplazada por su valor sin afectar el comportamiento del programa

// not referentially transparent
Math.random();

// referentially transparent
Math.max(1, 2);

Valores inmutables

  • Son inherentemente seguros para subprocesos y, por lo tanto, no necesitan estar sincronizados
  • Son inherentemente seguros para subprocesos y, por lo tanto, no necesitan estar sincronizados
  • No necesita ser clonado
  • Son inherentemente seguros para subprocesos y, por lo tanto, no necesitan estar sincronizados
  • No necesita ser clonado
  • El problema con el estado compartido es que para comprender los efectos de una función, debe conocer el historial completo de cada variable compartida que la función utiliza o afecta.

...

Estructuras de datos funcionales

(Código...)

Funciones

(Código...)

Datatypes

Un datatype es una abstracción que encapsula un patrón de codificación reutilizable.

 

 

Datatypes

Un datatype es una abstracción que encapsula un patrón de codificación reutilizable.

 

Nos permite modelar efectos.

Option

Modela el efecto de la opcionalidad (ausencia potencial de un valor).

 

Representa un valor opcional

(Código...)

try {
  //  Block of code to try
}
catch(Exception e) {
  //  Block of code to handle errors
}

Los problemas con excepciones

Las excepciones se pueden ver como una declaración GOTO dado que interrumpen el flujo del programa saltando de regreso a la persona que llama

Las excepciones no son consistentes, ya que lanzar una excepción puede no sobrevivir a los límites asíncronos

Las excepciones no son consistentes, ya que lanzar una excepción puede no sobrevivir a los límites asíncronos

(Una función que es asíncrona dentro de un try/catch no puede capturar la excepción potencialmente lanzada en un hilo diferente)

A menudo conducen a un código incorrecto y peligroso porque Throwable es una jerarquía abierta donde puedes capturar más de lo que originalmente pensabas.

Las excepciones son costosas de crear. Throwable intenta recopilar toda la información de la pila para presentarte un seguimiento de pila significativo.

Try

Modela el efecto de los fallos (gestiona las excepciones como efectos).

 

Representa un calculo que puede generar una excepción o devolver un valor

Try

Modela el efecto de los fallos (gestiona las excepciones como efectos).

 

Representa un calculo que puede generar una excepción o devolver un valor

Hace explícito que puede fallar

(Código...)

Either

Modela el efecto del fallo y el éxito

 

Errores como parte del dominio

(Código...)

// Scala

def foo(n: Int): Either[String, Int] = {
  if (n % 2 == 0)
    Right(1)
  else Left("Error")
}

def bar = Right(2)

for {
  x <- foo(2)
  y <- bar
} yield x + y
// Rust

fn foo(n: i32) -> Result<i32, String> {
    if n % 2 == 0 {
        Ok(1)
    } else { Err(String::from("Error")) }
}

fn bar() -> Result<i32, String> {
    Ok(2)
}

fn foo_bar() -> Result<i32, String> {
    let res = foo(2)? + bar()?;
    Ok(res)
}

let fb = foo_bar();

Future

Modela la latencia como efecto. (Maneja tanto la latencia como las excepciones como efectos)

Executor

newSingleThreadExecutor

newScheduledThreadPool

newCachedThreadPool

newFixedThreadPool

(Código...)

Validation

Devuelve el resultado de agregar múltiples cálculos que pueden fallar. (Se usa para acumular errores)

(Código...)

Conclusión

Gracias

Made with Slides.com