Articles

A beginner friendly intro to functional programming

Johann Schuster
Oct 25, 2017 · 7 min read

Photo by Sebastien Gabriel on Unsplash

Functional programming is a highly valued approach to writing code, and it’s popularity is continuously increasing in aplicaciones de software comercial. La programación funcional es un paradigma de escritura de código y se pone elocuentemente en la introducción de este artículo de Wikipedia:

» – un estilo de construcción de la estructura y los elementos de los programas de computadora — que trata la computación como la evaluación de funciones matemáticas y evita el cambio de estado y los datos mutables. Es un paradigma de programación declarativa, lo que significa que la programación se realiza con expresiones o declaraciones en lugar de declaraciones.»

Muy pronto entraremos en lo que esto significa exactamente, pero primero, quitemos los fundamentos del camino proporcionando un poco de contexto. Este artículo tiene el propósito de presentarle los conceptos fundamentales de la programación funcional y, al final, habríamos establecido una comprensión básica de por qué elegiríamos aplicarla en nuestros estilos de codificación, cómo se relaciona con JavaScript y algunos patrones básicos que puede comenzar a implementar en su código. Esté atento a un segundo artículo que se basará en este y profundice aún más en las ideas discutidas aquí.

Las raíces de la programación funcional se encuentran en el cálculo Lambda, que fue un sistema desarrollado en la década de 1930 para expresar la computación utilizando funciones similares a las que veremos muy pronto. Durante bastante tiempo, los conceptos y lenguajes de programación funcionales se discutieron ampliamente en contextos académicos y académicos y, finalmente, se derramaron en el desarrollo de software comercial. Lo que hace que un lenguaje de programación sea funcional o no es su capacidad para facilitar el paradigma de programación funcional, lenguajes como estos son Ruby, Python, Julia y JavaScript, el último de los cuales tiene propiedades de paradigmas imperativos, orientados a objetos y funcionales.

veamos un ejemplo de uso de un imperativo, y, a continuación, un enfoque funcional para completar una sola tarea.

Imprescindible:

const arr = function getOdds(arr){
let odds = ; for(let i = 0; i < arr.length + 1; i++){
if ( i % 2 !== 0 ){
odds.push( i )
};
};
return odds
};console.log(getOdds(arr))
// logs

Funcional:

function getOdds2(arr){
return arr.filter(num => num % 2 !== 0)
}console.log(getOdds2(arr))
// logs // this can be even shorter
const getOdds3 = arr => arr.filter(num => num % 2 !== 0)console.log(getOdds3(arr))
// logs

Además de las mejoras obvias que hace el enfoque funcional, como un código más corto, que nos ahorra un par de pulsaciones de teclas, y el hecho de que es mucho más fácil de entender a simple vista, también es elegante, lo que resulta en un código más limpio, simplifica la depuración, las pruebas y el mantenimiento.

Vamos a desglosar esto un poco, para que podamos llegar a una comprensión clara de las diferencias entre los dos enfoques y definir qué es la programación funcional.

En el primer enfoque, estamos describiendo imperativamente cada evento que necesita tener lugar para que podamos lograr la tarea de filtrar los números impares de una matriz. Alimentamos una función con una matriz, dentro de la función creamos una matriz vacía que usaremos para almacenar los números impares. Le decimos que haga un bucle sobre la matriz, luego declaramos un condicional, si el índice actual es un número impar, lo empujamos al vacío. El bucle for no incluye el último número de la matriz, solo incluye los números que conducen a él, por lo que si nuestro último número es impar, no se incluirá. Por lo tanto, agregamos +1 al definir la cantidad de iteraciones que nuestro bucle necesita hacer.

En el segundo enfoque, simplemente definimos el resultado que queremos ver utilizando un método llamado filtro, y permitimos que la máquina se encargue de todos los pasos intermedios. Este es un enfoque más declarativo. Declaramos cuál debe ser el resultado final, y nosotros el resto se maneja por nosotros.

Ahora podemos ver lo que la definición mencionada se esfuerza por expresar. Una forma de programación, usando declaraciones y expresiones, en lugar de declaraciones. Esta definición solo raspa la superficie de la programación funcional, y construiremos continuamente sobre nuestra definición a medida que crezca nuestra comprensión.

Algunas diferencias entre los enfoques iterativos y funcionales.

  • Estilísticamente, definimos un problema y los cambios que nos gustaría ver, en lugar de explicarlo paso a paso.
  • No necesitamos administrar el estado en nuestras funciones como antes, donde administramos el estado de nuestro array vacío.
  • No tenemos que preocuparnos tanto por el orden de ejecución.
  • Usamos menos bucles, condiciones y usamos más métodos integrados, funciones reutilizables y recursividad.

Al usar este enfoque, finalmente escribimos código más limpio que, como se mencionó anteriormente, nos ayuda en la depuración y el mantenimiento. Mantiene las cosas modulares, y las secciones de nuestro código se dividen en piezas más pequeñas que podemos probar con facilidad. Podemos reutilizar partes de nuestro código usando funciones auxiliares y, por último, es un enfoque matemático más eficiente para escribir código.

Los Pilares: Nuestro kit de herramientas de codificación para escribir código funcional

Los siguientes son algunos aspectos importantes para escribir código funcional de alta calidad. Al ver que se trata de una visión general, no nos adentraremos demasiado en cada una, en lugar de ello, solo definiremos algunas características clave y un ejemplo de cada una.

Funciones Puras:

Las funciones puras devuelven un valor basado únicamente en lo que se le pasó. La idea detrás de esto es que será una función pura si siempre devuelve el mismo resultado si se le pasan los mismos valores, y no modifica valores fuera del ámbito ts, lo que la hace independiente de cualquier estado en el sistema. Por lo tanto, una función pura nunca puede mutar datos, no producir efectos secundarios y puede reutilizarse fácilmente. Un ejemplo de una función no pura será una función que realiza una llamada a la API o devuelve un resultado impredecible.

Simple Impura función:

var tip = 0;function calculateTip( mealTotal ) {
tip = 0.15 * mealTotal;
}calculateTip( 150 )
console.log(tip)

Simple función Pura:

function isPure(x,y) {
return x * y
}console.log(isPure(3,5));

La función pure devolverá el resultado exacto cada vez, y no mutará ningún dato fuera de ella. Lo importante a lo que hay que prestar atención es que una función pura debe mantenerse alejada de la mutación de datos en absoluto, así que tenga cuidado al seleccionar qué métodos usar dentro de sus funciones puras. Por ejemplo, si desea fusionar dos matrices dentro de su función, como normalmente haría una en un reductor de React, evite usar la matriz.prototipo.método push (). En su lugar, querrías usar Array.prototipo.concat (), que preservará el estado de las matrices antiguas y devolverá una nueva para su uso.

Funciones de orden superior:

En Javascript, las funciones se tratan como objetos, por lo que podemos pasar funciones como lo haríamos con cualquier otro valor. Una función de orden superior es simplemente una función que opera en otras funciones. Pueden tomar una función como entrada o devolver una como salida. Veremos un ejemplo sencillo en la siguiente demostración.

Funciones anónimas:

Las funciones anónimas son muy útiles cuando necesitamos definir la lógica ad hoc que necesitamos. Como su nombre indica, una función anónima en sin nombre, y en su mayoría se encuentra como un argumento para una función como reemplazo de una función con nombre, una función asignada a una variable, o devuelta como una función en una función de orden superior. Sus raíces se encuentran en gran medida en el cálculo Lambda y es muy importante para todos los lenguajes de programación funcionales.

Función anónima asignada a una variable. Fácil de transmitir e invocar cuando sea necesario.

const myVar = function(){console.log(‘Anonymous function here!’)}myVar()

Función anónima como argumento

setInterval(function(){console.log(new Date().getTime())}, 1000);

Funciones anónimas dentro de una función de orden superior

function mealCall(meal){
return function(message){
return console.log(message + " " + meal + ‘!!’)
}
}const announceDinner = mealCall(‘dinner’)
const announceLunch = mealCall(‘breakfast’)announceDinner(‘hey!, come and get your’)
announceLunch(‘Rise and shine! time for’)

Recursión

La recursión es una técnica de programación funcional bien conocida. Una función recursiva es simplemente una función que se llama a sí misma, y por lo tanto actúa como un bucle ejecutando el mismo código varias veces. Sin embargo, viene con una advertencia, uno debe tener cuidado de evitar repeticiones infinitas. Por lo tanto, se necesita un estuche base para decirle cuándo detenerse. Las funciones recursivas o los algoritmos se pueden implementar utilizando recursión y bucles, pero es mejor usar recursión. A continuación se muestra el conocido algoritmo para factorizar un número usando recursión y un bucle.

función Recursiva

function factorialize(num){
if (num === 0 || num === 1){return 1;}
return (num * factorialize(num — 1));
}var result = factorialize(14);console.log(result);

la Recursividad mediante un bucle

function factorialize(num) {
if (num === 0 || num === 1){
return 1;
}
for (var i = num-1; i >= 1; i-- ) {
num *= i;
}
return num;
}
console.log(factorialize(6));

Hemos cubierto algunos de los ingredientes esenciales para la escritura de código funcional. No es posible escribir siempre código funcional en una aplicación, pero los beneficios son excelentes cuando se usa tanto como sea posible. Frameworks como Angular y React están fuertemente influenciados por la programación funcional, y bibliotecas como Redux y Lodash nos permiten utilizar los beneficios de la misma, por lo que definitivamente hay un gran beneficio para comenzar a pensar de la manera FP.

Recursos para aprender más? Aquí hay algunos excelentes artículos y recursos para un mayor aprendizaje.

  • ¿Por qué aprender Programación Funcional en JavaScript? por Eric Elliot
  • Elocuente JavaScript por Marijn Haverbeke
  • usted desea Tan ser Funcional Programador por Charles Scalfani

Foto por Patrick plano en Unsplash

yo realmente espero que esto fue útil y en el próximo artículo vamos a profundizar un poco más y abrir aún más interesantes y útiles herramientas como JavaScript métodos de aplicación parcial, alarmada, el argumento de unión y más.

¡Siéntase libre de aplaudir, compartir, criticar o compartir cualquier pensamiento sobre el tema!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *