El código funcional tiende a ser más conciso, más predecible y más fácil de probar
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
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
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
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
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
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);(Código...)
(Código...)
Un datatype es una abstracción que encapsula un patrón de codificación reutilizable.
Un datatype es una abstracción que encapsula un patrón de codificación reutilizable.
Nos permite modelar efectos.
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
}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
(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.
Modela el efecto de los fallos (gestiona las excepciones como efectos).
Representa un calculo que puede generar una excepción o devolver un valor
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...)
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();Modela la latencia como efecto. (Maneja tanto la latencia como las excepciones como efectos)
(Código...)
Devuelve el resultado de agregar múltiples cálculos que pueden fallar. (Se usa para acumular errores)
(Código...)