
¿Qué es la programación funcional?
La programación funcional es un paradigma de programación declarativa que se basa en lo que se llama verdaderas funciones matemáticas.
El lenguaje funcional le da énfasis a las sentencias y términos en lugar de ejecutar instrucciones. En esta programación, el resultado solo dependerá de los parámetros que se pasen a una función, a diferencia de otros tipos que obedecen a un estado local o global.
Su nombre proviene de las funciones matemáticas, que son la asignación de un conjunto de entradas a un conjunto de salidas. Una función matemática realmente no realiza ninguna labor, sino que describe el modelo de un proceso, explicando por medio de una fórmula lo que un conjunto de entradas produce en una función.
Ideas básicas de la programación funcional
El fundamento en que se basó la programación funcional fue el cálculo lambda, desarrollado durante la tercera década del siglo XX para definir y aplicar funciones. LISP fue el primer lenguaje de programación de este tipo, diseñado en 1960.
Aunque la mayoría de los lenguajes de programación consisten en entradas, salidas y variables externas que se pueden configurar o usar desde las funciones, la programación funcional lo evita. La idea es que cada vez que se llame a una función con los mismos parámetros, deberá devolver el mismo valor.
Características de la programación funcional
Los lenguajes de programación funcional se denominan aplicativos, debido a que las funciones se aplican a sus parámetros, además de declarativos y no procesales, ya que las definiciones especifican qué se quiere calcular y no cómo se calcula.
– Funciones puras. Una función es pura cuando no tiene efectos secundarios observables, como alteración de las variables externas, cambios en el sistema de archivos, etc. Estas funciones se consideran convincentes, ya que no cambiarán expresamente ninguna variable de la que pudieran depender otras partes del código en algún momento. Pareciera incómodo codificar con estas restricciones, pero se debe considerar que estas funciones son deterministas, predecibles y componibles.
– Funciones de primera clase. Las funciones se consideran como valores que se pueden asignar a variables, por lo cual se las puede pasar hacia y retornar desde otras funciones. Es decir, una función se puede usar como si fuera un parámetro o como un valor que se está retornando. Esto implica que se pueda transmitir la función como tal, en lugar de únicamente el resultado de la función. Por ejemplo, consideremos la función double(x), la cual retorna el doble del valor de su parámetro de entrada. Así, double(2) retornaría 4. Como es una función de primera clase, el código (double(double(2)), sería lo mismo que el código double(4). Esto permite anidar una función como parámetro de otra y así sucesivamente.
– Transparencia referencial. Se refiere a que en este patrón de programación no existen las sentencias de asignación. Es decir, se deberán definir nuevas variables si se desea almacenar valores adicionales. Por tanto, el estado de una variable es constante en todo momento. Esto elimina la más mínima posibilidad de efectos indeseados, porque cualquier variable puede ser reemplazada por su valor real durante cualquier punto de ejecución del programa.
– Recursividad. En la programación funcional no existen los bucles “for” y “while”. En su lugar, para la iteración se depende de la recursividad. La recursión se implementa utilizando funciones recursivas, que se llaman a sí mismas de forma repetitiva hasta alcanzar el caso base.
– Inmutabilidad. Las variables son inmutables, es decir, no es posible modificar una variable una vez que se ha inicializado. Aunque se puede crear una nueva variable, no se permiten modificar las variables existentes.
Ejemplos de programación funcional
- Enfoques imperativos y declarativos. Con un ejemplo se puede analizar la diferencia entre estos enfoques, realizando la misma operación en ambas disposiciones, que es filtrar los números impares de una lista mientras se sustituyen por 5 los números pares menores de 5. Es el mismo cálculo, con el mismo resultado. Sin embargo, como se puede ver, el código imperativo es detallado y no está claro de inmediato. Por otro lado, el enfoque declarativo es legible y explícito, porque se centra en lo que se quiere obtener.

- Funciones puras. Se puede aclarar lo que se define como funciones puras e impuras con algunos ejemplos básicos:

- Funciones como objetos de primera clase. Significa usar las funciones de la misma manera que se usan los datos. Por tanto, se pueden pasar como parámetros a otra función. En el siguiente ejemplo se puede pasar la función int como parámetro a la función map:
>>> list(map(int, [“1”, “2”, “3”]))
[1, 2, 3]
- Se pueden asignar a variables y retornarlas. Por ejemplo, en el siguiente código se puede asignar la función hello_world, ejecutando luego la variable como una función.

Ventajas y desventajas de la programación funcional
Ventajas
- Código más fácil de entender. Las funciones suelen ser pequeñas y tienen una única responsabilidad. Al evitar cambios de estado, el comportamiento es más predecible.
- Menos errores. La inmutabilidad reduce problemas causados por modificar datos accidentalmente. Las funciones puras facilitan detectar fallos.
- Facilidad para hacer pruebas. Como las funciones puras siempre producen el mismo resultado, son fáciles de probar con tests automáticos.
- Mejor mantenimiento. El código modular y desacoplado permite hacer cambios sin afectar otras partes del programa.
- Favorece la reutilización. Las funciones pueden combinarse y reutilizarse fácilmente.
- Más segura para programación concurrente. Al no compartir estados mutables, disminuyen los problemas de sincronización en programas paralelos.
- Código más declarativo. Se enfoca en “qué hacer” en lugar de “cómo hacerlo”, haciendo el código más expresivo.
Desventajas
- Curva de aprendizaje elevada. Conceptos como recursividad, composición de funciones o inmutabilidad pueden ser difíciles para principiantes.
- Puede ser menos intuitiva. Para programadores acostumbrados al paradigma imperativo u orientado a objetos, puede resultar extraña al principio.
- Mayor consumo de memoria. Crear nuevos datos en lugar de modificar los existentes puede aumentar el uso de memoria.
- Rendimiento en algunos casos. La recursividad y la creación constante de estructuras nuevas pueden ser menos eficientes si no están optimizadas.
- Depuración más compleja. El uso excesivo de funciones encadenadas o expresiones compactas puede dificultar el seguimiento de errores.
- No siempre es ideal para todos los problemas. Algunas aplicaciones, especialmente las muy orientadas al estado o interfaces gráficas, pueden ser más fáciles de desarrollar con otros paradigmas.
- Menor soporte en algunos lenguajes. Aunque muchos lenguajes modernos incluyen características funcionales, no todos están diseñados completamente para este paradigma.
Aplicaciones de la programación funcional
La programación de inteligencia artificial se realiza en lenguajes de programación funcional y las técnicas de inteligencia artificial migran a aplicaciones del mundo real.
Sobresale también en la implementación de modelos matemáticos complejos. Por esta razón, uno de los principales usos de los lenguajes funcionales ha sido tradicionalmente académico. Es útil para desarrollar especificaciones ejecutables e implementaciones de prototipos.
Muchos lenguajes funcionales también se destacan para implementar el procesamiento paralelo. Esto se debe a su capacidad de aprovechar las funciones puras, que siempre retornan el mismo valor independientemente del orden en que se ejecutan.
- Metodología funcional. WhatsApp utiliza el lenguaje de programación Erlang, que sigue el modelo de programación funcional, permitiendo así que más de una centena de sus empleados manejen los datos pertenecientes a unas 1.600 millones de personas. Otro portador importante del estilo de programación funcional es Haskell. Es utilizado por Facebook en su sistema antispam. Incluso JavaScript, uno de los lenguajes de programación más utilizados, hace alarde de las propiedades de un lenguaje funcional de tipo dinámico.
- Lenguajes que soportan programación funcional
- D. Fue diseñado después de C++, obteniendo todos sus beneficios a la vez que elimina sus debilidades observadas por tener que ser compatible con C.
- Erlang. Es altamente escalable y concurrente, haciéndolo ideal para las telecomunicaciones y otras aplicaciones que reciben cantidades masivas de datos en un orden impredecible.
- Haskell. Este es un lenguaje puro de programación funcional, que utiliza para ello el cálculo Lambda.
- ML. Se utiliza en aplicaciones matemáticas, científicas, financieras, analíticas y de otros tipos. Una de sus fortalezas es hacer software para manejar otros programas.
- Objective Caml. Es un lenguaje de código abierto que se basa en Caml. Tiende a crear programas muy livianos, ayudando a que estos se puedan cargar y ejecutar más rápidamente que los creados por otros lenguajes.
- Scheme. Está basado en la sintaxis de LISP y la estructura de ALGOL. Gracias a su simplicidad, se utiliza en muchos cursos de informática como introducción al diseño de programas para mostrar algunos de los fundamentos de la programación informática.
Referencias
- Learn Functional Programming: This Style of Coding Will Blow Your Mind. Recuperado de whoishostingthis.com.
- Bertoli, A. An Adequate Introduction to Functional Programming. Recuperado de dev.to.
- Functional Programming. Recuperado de hackerearth.com.
- Functional Programming. Recuperado de clojure.org.
- What is Functional Programming? Tutorial with Example. Recuperado de guru99.com.