Awesome functional programming en JavaScript — Spanish version

- 7 mins

JavaScript es un lenguaje de programación multi-paradigma, casi siempre utilizado orientado a objetos, aunque debido a su gran popularidad, se podría decir que es el lenguaje de programación funcional (FP) más utilizado.

Disclaimer:* Este artículo no pretende enseñar ni introducir en profundidad la programación funcional, sino que es una guía de bibliotecas y recursos, para poder utilizar la mayoría de herramientas y capacidades que da el estilo de programación funcional en JavaScript.*

Lambda — Representa el lambda calculus, base de la programación funcional.

¿Qué es la programación funcional?

Empecemos con una breve introducción de la programación funcional para ponernos en contexto.

La programación funcional es un paradigma de programación que se basa en funciones modeladas como funciones matemáticas. La esencia de la programación funcional es que los programas son una combinación de expresiones. Las expresiones pueden ser valores concretos, variables o funciones. Las funciones se pueden definir de forma más específica: son expresiones a las cuales se les aplica un argumento o entrada, y una vez aplicadas, se pueden reducir o evaluar. En los lenguajes funcionales y lenguajes modernos, las funciones son ciudadanos de primer clase: se pueden utilizar como valores o pueden ser pasadas como argumentos, o entradas, a otras funciones.

Cabe destacar que, los lenguajes puramente funcionales, están todos basados en el lambda calculus.

¿Por qué JavaScript?

Ciertamente, no es el mejor lenguaje para hacer FP, siendo que la corriente actual suele programar en JavaScript de forma imperativa. Además, no es un lenguaje de programación funcional puro, y es débilmente y dinámicamente tipado 😥.

Sin embargo, sus puntos a favor son:

Bibliotecas (que facilitan la programación funcional)

Voy a hablar, en este punto, de unas pocas bibliotecas, que he elegido y utilizado para FP en JavaScript.

Sanctuary

La primera de ellas (y mi favorita) es Sanctuary, cuyo lema es *“El refugio del JavaScript inseguro”, *refiriéndose a que ayuda a eliminar muchos errores en tiempo de ejecución, sobre todos los provocados por valores nulos.

Sanctuary está inspirado por los lenguajes de programación Haskell y PureScript. Provee un conjunto de funciones similares a Ramda y lodash-fp, pero muchas de ellas son seguras y trabajan con data types directamente, como por ejemplo el tipo Maybe.

Provee dos data types básicos, Maybe y Either, que cumplen la especificación de Fantasy Land, que es la especificación de facto de ADTs en JavaScript.

Promueve un estilo de programación más seguro, sin los odiosos null checks, y reduce los posibles errores en tiempo de ejecución.

Una gran ventaja es su sistema de tipos ad-hoc en tiempo de ejecución, definidos en sanctuary-def. Con este sistema podemos detectar los errores causados por tipos de forma inmediata, lo cual nos evita las clásicas sorpresas de JavaScript…

Conviene leer la entrevista que se le hizo a su creador, donde se explica el por qué de la biblioteca.

Fluture

Fluture, es una biblioteca para provee de una mónada para ejecutar código asíncrono, parecido a una promesa. Como tal, representa un valor success *o *failure, *que resulta de una operación asíncrona de *I/O. La diferencia es que Fluture es una mónada (cumple con su interfaz y leyes), por lo tanto se evalúa de forma perezosa y no lanza los side-effects al crearla.

Puede haber confusión entre las similitudes de una Promesa con una mónada. Se podría decir que el .then *es un *bind, *que el resolve es un pure, etc. *Pero no hay que olvidarse de que, una promesa, no ofrece la interfaz especificada por Fantasy Land, ni mucho menos, las leyes de las mónadas. Además de que ejecutan la operación asíncrona (side effects) nada más crearlas. Se puede ver más claro en este artículo.

Daggy

Daggy, es una pequeña, pero muy útil, biblioteca cuya finalidad es crear ADTs (También llamados Union Types por la comunidad JS/ELM). Permiten representar datos complejos de forma natural e incluso emular pattern matching.

En el siguiente ejemplo, se puede ver una** brillante manera** de usar las ADTs creadas con Daggy en componentes de React.

Otras

Cabe destacar también, la biblioteca RamdaJS, que utilicé en su día junto a Sanctuary. Es una biblioteca de utilidades, es parecida a Underscore o lodash, pero ahora, Sanctuary es mucho más madura que al principio y ha incorporado la mayoría de funciones que provee Ramda, y por ello, dejé de usarla. Las principal diferencia entre ambas son como manejan las entradas invalidas y el sistema de tipos en runtime. Ramda es más insegura (sus funciones pueden causar excepciones) porque los creadores no quieren utilizar data types (ellos creen que les quitaría usuarios), y solo proveen de funciones típicas en programación funcional, como map, sin aprovechar todo el potencial de este paradigma de programación.

Y FolktaleJS, una de las pioneras. Su versión 1.o siempre ha sido muy respetada y ahora están haciendo un gran trabajo en la 2.0, reescribiéndola por completo. Es el mismo concepto que Sanctuary, funciones tipo map, curry, chain, etc y tipos de datos como Maybe, Either, Validation… Se podría decir que Folktale es más orientado a un estilo Java y Sanctuary más hacia Haskell. Además Folktale incluye el tipo Task para tareas asíncronas, muy parecido a lo que ofrece la biblioteca Fluture.

Libros y artículos

Ejemplos

Otros recursos

El repositorio de Awesome FP JS provee de muchos recursos además de los aquí comentados.

Bola extra: TypeScript

Sólo comentar que se Giulio Canti está en proceso de creación de la biblioteca FP-TS, que permitirá el uso de la programación funcional en TypeScript, con la gran mejora sobre JavaScript, de los tipos, que ayudan a escribir código más correcto. Gracias a estos, se puede emular cierto grado de pattern matching en TypeScript, sin bibliotecas adicionales, como se explica aquí.

Conclusión

Con la combinación de las bibliotecas Sanctuary, Fluture, Daggy, podemos llegar a programar en el paradigma de programación funcional de una manera muy similar a la que lo haríamos en cualquier otro lenguaje funcional, salvando las distancias.

Con este artículo quería demostrar que es posible poner en práctica los conceptos y herramientas de la FP, sin tener que recurrir a un lenguaje especializado.

Por otro lado quiero decir, que por sólo hacer FP no vas a desarrollar programas perfectos, sino que te expones a los mismos problemas que si no haces FP… pero que aprender FP te va a ayudar a aprender nuevos conceptos para ser mejor programador… como se discute aquí.

También quiero recomendar el uso en desarrollos frontend de otros lenguajes tipados como PureScript, Elm, ReasonML, que ayudan a escribir programas más correctos, sobre todo cuando se trata de proyectos más grandes y complejos.

Antes de finalizar, decir que en los enlaces que se han ido poniendo a lo largo del artículo de puede ampliar más información.

Finalmente, para el siguiente post, veremos un ejemplo sencillo de como parsear JSON de un servidor de forma segura con programación imperativa vs programación funcional.

Ricardo Pallas

Ricardo Pallas

λ Software Engineer

rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora