Programación Funcional

¿De qué se trata?

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.

Entre los paradigmas más utilizados se encuentran:

Programación imperativa
El código es ejecutado siguiendo un orden desde el principio del programa hasta su final. Sus elementos principales son las asignaciones, que producen un cambio de estado de una variable, y las estructuras de control que permiten modificar el flujo de ejecución de las instrucciones de un programa (if, bucles, etc.).
Programación Orientada a Objetos (POO)
Las variables y funciones se agrupan dentro de estructuras (objetos) que interactúan enviando mensajes entre ellos.
Programación Funcional

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.

Lenguajes funcionales

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:

Programación funcional y JavaScript

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

Algunas ventajas y desventajas de programar funcionalmente

Ventajas

Desventajas

Ejemplos

Clausuras (closures)

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).