Es uno de los "paradigmas de programación", es decir una de las formas en que un lenguaje entiende los programas que se realizan con el mismo.
El código se reparte en funciones, en general simples, que pasan a ser un elemento fundamental del programa. Estas funciones pueden actuar al nivel de las variables en otros paradigmas, pudiendo utilizarse como parámetros de otras funciones, ser retornadas por estas y anidarse (funciones dentro de funciones).
Los datos en general no son variables, y se evitan la mayoría de los efectos colaterales.
En un lenguaje funcional puro no hay cambios de estado; programar consiste en definir las relaciones funcionales que transforman la entrada en la salida esperada.
La programación funcional se comienza a estudiar en los años '30 (antes de la invención de las computadoras) para resolver algunos problemas matemáticos.
A fines de los '50 se crea el primer lenguaje funcional: LISP, utilizado en la investigación de la inteligencia artificial
Durante un tiempo el paradigma funcional tuvo poco uso en la industria (todavía lo tiene), pero ultimamente está aumentando su utilización, con la aparición de nuevos lenguajes y la extensión de otros para utilizar conceptos funcionales.
Como ejemplo de lenguajes funcionales tenemos:
Y de lenguajes no funcionales que agregan elementos funcionales:
JavaScript, desde su creación contiene elementos funcionales: las clausuras, las funciones como valores, la delegación de prototipos y otros son ideas tomadas de los lenguajes Scheme y Self. Por eso JavaScript se adapta bastante bien a la programación funcional.
Además, ES6 añade algunas nuevas funcionalidades muy interesantes para el desarrollo funcional como la notación que expande elementos iterables (por ej. String, Array, Map, Set ) con ... o las funciones flecha =>
Otros elementos funcionales se utilizan en el manejo de arreglos: filter, map, reduce
También hay librerías que utilizan programación funcional como React y Redux entre otras.
Se pueden usar algunos lenguajes como ClojureScript y Elm que generan código JavaScript
Son funciones retornadas por otras funciones, que mantienen las variables del entorno presentes en el momento en que fueron creadas.
function sumaMultiplica(x){
let acumulador = 0;
return function(y){
acumulador = acumulador + x * y
return acumulador;
}
}
// uso:
let por5 = sumaMultiplica(5);
let por17 = sumaMultiplica(17);
let a = por5(9); // a = 45 (0 + 9 * 5)
let b = por5(4); // b = 65 (45 + 5 * 4)
let c = por17(23) // c = 391 (0 + 17 * 23) el acumulador es distinto al de por5
let d = por17(2) // d = 425 (391 + 17 * 2)
Al llamar a la función sumaMultiplica(x) se retorna la función anónima (es decir sin nombre) de su interior, y la función sumaMultiplica(x) deja de estar activa, pero al asignarla a una variable let por5 = multiplica(5); esta conserva la función interna retornada junto con cualquier parámetro recibido por la función externa (el 5) y cualquier variable que se encuentre en la misma (el acumulador=0).