JS, Node.js, Frontend, Backend, Firebase, Express, Patrones, HTML5_APIs, Asincronía, Websockets, Testing
En ciencias de la computación, la 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.1 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. Wikipedia
/* Objetivo: Reducir a una dimension, filtrar, modificar, ordenar...
- Punto de partida: [[5,8], [3], [4,2,6,1], [7,9]];
- REDUCIR a una dimension
- FILTRAR los < 5
- MAPEAR los elementos * 10
- ORDENAR de mayor a menor
- Resultado Final: [40,30,20,10]
*/
const matrix = [[5,8], [3], [4,2,6,1], [7,9]];
const lista = matrix;
.reduce((a,b) => a.concat(b))
.filter(item => item < 5)
.map(item => item * 10)
.sort((a,b) => b - a);
console.log("lista:", lista);
Lenguajes que lo implementan
Conceptos básicos y jerga
- Transparencia referencial
- Efectos colaterales
- Recursividad
- Funciones puras
- Funciones de orden superior
- Funciones de primera clase
- Evaluación estricta frente a la no estricta
- Sistemas de tipos
- muchos más...
Ventajas
- El código es más conciso y expresivo
- El estado sea inmutable, evita muchos errores (sin efectos colaterales)
- Ideado para sistemas concurrentes (paralelos)
- Entrada y salida; Las funciones reciben parámetros y devuelven un resultado.
- Las funciones puras son muy previsibles y testeables
- Código infinitamente más expresivo
- Proceso de depuración simplificado
- Fomenta mucho la descomposición de las tareas complejas
- Hacemos uso de composiciones partiendo de fragmentos pequeños y especializados
- Métodos encadenados, tuplas y currificación
Desventajas
- Falta soporte nativo (tuplas, curry, etc...)
- Es un paradigma menos extendido
- Propensión a los errores, ya que JS no es estrcito con el pardaigma funcional
- El tipado debil puede ser preocupante
- Se acerca mucho a las matemáticas
- Gestión de recursos
- Necesidad de realizar una gran cantidad de abstracciones ad hoc
Recursos Clave
- JavaScript Functional Programming Cookbook (ES6)
- Programación Funcional En JavaScript con Javier Velez
- La programación funcional | That CS guy
- el.abismo = de[null] | Serie de Programación funcional
Más Recursos
- xgrommx/awesome-functional-programming
- stoeffel/awesome-fp-js
- Ebook | Functional Programming in JavaScript: How to improve your JavaScript programs using functional techniques
- El resurgir de la programación funcional
- Aterrizando en la programación funcional
- Scala.js deja de ser un experimento, no es sólo un compilador de Scala a JavaScript
- Anjana Vakil: Learning Functional Programming with JavaScript - JSUnconf
- Programación funcional pura en JavaScript - JSDayES 2016
- Functional programming in JavaScript en Fun Fun Function
- Introducción a programación funcional en JavaScript—Parte 1
- Introducción a la programación funcional en JavaScript
- Qué es la programación funcional y por qué deberías usarla
- ¿Qué es la programación funcional?
- So You Want to be a Functional Programmer (Part 1)
- Here’s Why Mapping a Constructed Array in JavaScript Doesn’t Work
- Functional programming paradigms in modern JavaScript: Partial Application
- Pros and cons of functional programming
- Demystifying functional programming (in a real company)
- Two Years of Functional Programming in JavaScript: Lessons Learned
- Coding Tip: Try to Code Without If-statements
- Javascript and Functional Programming: An Introduction
- How Immutable Data Structures (E.g. Immutable.js) are Optimized
- Make your code easier to read with Functional Programming
- Diferencias entre la programación funcional y La programación imperativa (C#)
- ¿Qué Es La Programación Funcional?
- dwyl/learn-elm
- dwyl/learn-elixir
- JavaScript promises are just like monads and I can explain both in less than 2 minutes
La Programación Funcional se refiere a la evaluación declarativa de funciones puras para crear programas inmutables y así evitar efectos secundarios que son observados externamente. El abismo de null
Programación declarativa
- Nos centramos en describir lo que hacer
- Evitamos especificar el flujo y los cambios de estado
- Sistema de cajas negras
// Imperativa (COMO hacerlo)
var lista = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for (let i = 0; i < lista.length; i++) {
lista[i] = lista[i]*lista[i];
}
console.log("Lista:", lista) // [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
// Declarativa (QUE hacer)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(num => num*num);
// [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Funciones puras (Pure Functions)
- Mantine las modificaciones en su
scope
- Solo toma los argumentos como entrada de información
- No modifica el contexto externo, por lo que se retorna la información directamente
- Transparencia referencial
- Inmutabilidad
// Función Impura
let numero = 1;
const incremento = () => numero += 1;
incremento(); // 2
//Función Pura
const incremento = n => n + 1;
incremento(1); // 2
// Función Impura
window.nombre = 'Ulises'
const saludos = () => `Hola, ${window.nombre}`
saludos() // 'Hola, Ulises'
//Función Pura
const saludos = (nombre) => `Hola, ${nombre}`
saludos('Ulises') // 'Hola, Ulises'
- modificar el valor de un argumento
- manipulación del DOM, BOM, Cookies, etc...
- Excepciones y gestión de errores
- APIs del navegador
Funciones de Orden Superior (Higher-order functions - HOF)
- Funcion que toma una funcion como argumento
- La función puede o no retornar una funcion
const sumador = (x, y) => x + y;
const calcular = (fn, x, y) => fn(x, y);
calcular(sumador, 1, 2); // 3
// Filtrado (Filter)
let coches = [
{id: 'X0001', kilometros: 60000},
{id: 'X0002', kilometros: 40000},
{id: 'X0003', kilometros: 90000}
];
const estaViejo = coche => coche.kilometros >= 60000;
coches.filter(estaViejo);
// [{id: "X0001", kilometros: 60000},{id: "X0003", kilometros: 90000}]
Recursividad (Recursion)
- Evitaremos el uso de bucles
- Utilizaremos funciones que se llaman a si mismas para generar una estructura similar al bucle
const cuentaAtras = numero => {
console.log(numero)
numero < 1 ? numero : cuentaAtras(numero - 1)
}
cuentaAtras(5);
const factorial = (num) => {
return num <= 0 ? 1 : num * factorial(num - 1)
}
factorial(5); //120
Composición funcional (Compose)
- Juntamos dos funciones para retornar una función nueva
const compositor = (f,g) => x => f(g(x));
const convMayusculas = x => x.toUpperCase();
const contador = x => `${x} [${x.length}]`;
const exclamar = x => `${x}!!!`
const textoContado = compositor(contador, convMayusculas);
const textoContadoExclamado = compositor(exclamar, compositor(contador, convMayusculas));
const textoExclamadoContado = compositor(contador, compositor(exclamar, convMayusculas));
textoContado("Lorem Ipsum"); // "LOREM IPSUM [11]"
textoContadoExclamado("Lorem Ipsum"); // "LOREM IPSUM [11]!!!"
textoExclamadoContado("Lorem Ipsum"); // "LOREM IPSUM!!! [14]"
Currificación (Currying)
La currificación es una técnica muy usada en programación funcional. Poder convertir funciones de varios parámetros en una sucesión de funciones con un único parámetro hace que consigamos sistemas más modulares y flexibles, lo que a la larga hará que mantengamos mejor nuestras aplicaciones y reutilicemos componentes. El abismo de null
const suma = (a, b) => a + b
const cumaCurrificada = (a) => (b) => a + b
cumaCurrificada(40)(2) // 42.
const sumaSegunda = cumaCurrificada(2) // (b) => 2 + b
sumaSegunda(10) // 12
Aridad
En el análisis matemático, la aridad de un operador matemático o de una función es el número de argumentos necesarios para que dicho operador o función se pueda calcular. Wikipedia
- Operación nularia significa aridad cero.
- Operación unaria o relación unaria significa aridad uno.
- Operación binaria o relación binaria significa aridad dos.
- Operación ternaria o relación ternaria significa aridad tres.
- La función variádica tiene una aridad indefinida, acepta una cantidad de argumentos variable.
function fun2 (arg1, arg2) {
//...
}
function fun3 (arg1, arg2, arg3) {
//...
}
console.log(fun2.length) // 2 -> Binaria
console.log(fun2.length) // 3 -> Ternaria
Aplicación parcial (Partial Application)
Aplicar parcialmente una funcion, significa crear una nueva funcion rellenando previamente alguno de los argumentos de la funcion original. idcmardelplata/functional-programming-jargon
En cualquier punto dado de un programa, la parte del codigo que aun esta por ejecutarse se conoce como continuación. idcmardelplata/functional-programming-jargon
Una funcion es idempotente si al volver a aplicarla sobre su resultado, no produce resultados diferentes. idcmardelplata/functional-programming-jargon
Y mucho más...
- Aridad
- Auto Currying
- Efectos secundarios
- Idempotente
- Estilo de punto libre o programación tacita
- Predicado
- Contratos
- Funciones guardas
- Categorías
- Valor
- Constante
- Functor
- Functor apuntado
- Elevar (lift)
- Transparencia referencial
- Razonamiento equacional
- Lambda
- Cálculo Lambda
- Evaluación Perezosa
- Monoide
- Mónada
- Co-mónada
- Functor Aplicativo
- Morfismo
- Setoide
- Semigrupo
- Plegable
- Traversable
- Signatura de tipos
- Tipos de unión
- Tipos de producto
- Opcional