Programación funcional: conceptos, ventajas, desventajas y aplicaciones

Programación funcional: conceptos, ventajas, desventajas y aplicaciones.La programación funcional es un paradigma de programación en el que se intenta vincular cada uno y todo en funciones matemáticas puras. Es un tipo de estilo de programación declarativo que se centra en qué resolver en lugar de cómo resolverlo (dirigido por el imperativo estilo de programación).

Clojure, Common Lisp, Erlang, Haskell y Scala son algunos de los lenguajes de programación notables que siguen el enfoque de programación funcional. El paradigma de programación se basa en el cálculo lambda, que se explica brevemente a continuación:

Cálculo lambda

En lugar de declaraciones, la programación funcional hace uso de expresiones. A diferencia de una declaración, que se ejecuta para asignar variables, la evaluación de una expresión produce un valor. El cálculo de Lambda forma la base de casi todos los lenguajes de programación funcionales en uso.

Desarrollado por Alonzo Church, Lambda Calculus es un marco para estudiar cálculos con funciones. Cualquier cosa que sea computable usando el cálculo lambda es computable. Sorprendentemente, se puede etiquetar como el lenguaje de programación más sucinto de todos.

En términos de su capacidad computacional, el cálculo lambda es similar a la máquina de Turing que sentó las bases para el estilo imperativo de programación. Para poner el cálculo lambda en palabras simples, es un marco teórico que describe las funciones y su evaluación.

Conceptos de programación funcional

Hay 5 conceptos más importantes relacionados con la programación funcional.

Funciones puras

Las funciones puras tienen dos propiedades importantes, ellas:

Produzca siempre la misma salida con los mismos argumentos sin tener en cuenta otros factores. Esta propiedad también se conoce como inmutabilidad.
Son deterministas Las funciones puras dan algún resultado o modifican cualquier argumento o variable global, es decir, no tienen efectos secundarios.
Debido a que las funciones puras no tienen efectos secundarios o E / S ocultas, los programas creados con programación funcional son fáciles de depurar. Además, las funciones puras facilitan la escritura de aplicaciones concurrentes.

Cuando el código se escribe utilizando el estilo de programación funcional, un compilador capaz puede:

Memoriza los resultados
Paralelo a las instrucciones
Espera a evaluar resultados
Recursividad

En el paradigma de programación funcional, no hay bucles for y while. En cambio, los lenguajes de programación funcionales dependen de la recursividad para la iteración. La recursión se implementa utilizando funciones recursivas, que se llaman a sí mismas de forma repetitiva hasta alcanzar el caso base.

Transparencia referencial

Las variables una vez definidas en un lenguaje de programación funcional no pueden cambiar el valor que tienen durante la ejecución del programa. Esto se conoce como transparencia referencial. Asegura que la misma expresión de lenguaje da el mismo resultado.

Los programas funcionales no tienen ninguna declaración de asignación. Para almacenar valores adicionales en un programa desarrollado mediante programación funcional, se deben definir nuevas variables. El estado de una variable en dicho programa es constante en cualquier momento.

La transparencia referencial elimina incluso la más mínima posibilidad de cualquier efecto no deseado debido al hecho de que cualquier variable puede ser reemplazada por su valor real durante cualquier punto de la ejecución del programa.

Las funciones son de primera clase y pueden ser de orden superior

Las funciones en el estilo de programación funcional se tratan como variables. Por lo tanto, son funciones de primera clase. Estas funciones de primera clase pueden pasarse a otras funciones como parámetros o devolverse de funciones o almacenarse en estructuras de datos.
Una función de orden superior es una función que toma otras funciones como argumentos y / o devuelve funciones. Las funciones de primera clase pueden ser funciones de orden superior en lenguajes de programación funcionales.

Las variables son inmutables

En la programación funcional, las variables son inmutables, es decir, no es posible modificar una variable una vez que se ha inicializado. Aunque podemos crear una nueva variable, no se permite modificar las variables existentes.

La naturaleza inmutable de las variables en un lenguaje de programación funcional se beneficia en la forma de preservar el estado durante la ejecución de un programa.

Ventajas

Debido a que las funciones puras no cambian ningún estado y dependen completamente de la entrada, son fáciles de entender. El valor de retorno dado por tales funciones es el mismo que el resultado producido por ellas. Los argumentos y el tipo de retorno de las funciones puras se dan por su firma de función.
Debido a la naturaleza de las funciones puras para evitar el cambio de variables o cualquier dato externo, la implementación de la concurrencia se vuelve eficaz
La programación funcional admite el concepto de evaluación diferida, lo que significa que el valor se evalúa y almacena solo cuando es necesario.
Las funciones puras toman argumentos una vez y producen una salida inmutable. Por lo tanto, no producen ningún resultado oculto. Utilizan valores inmutables, lo que facilita la depuración y las pruebas.
El estilo de programación funcional trata las funciones como valores y pasa las mismas a otras funciones como parámetros. Mejora la comprensión y la legibilidad del código.

Desventajas

Los valores inmutables combinados con la recursividad pueden conducir a una reducción en el rendimiento.
En algunos casos, escribir funciones puras provoca una reducción en la legibilidad del código
Aunque escribir funciones puras es fácil, combinar las mismas con el resto de la aplicación y las operaciones de E / S es difícil
Escribir programas en estilo recursivo en lugar de usar bucles para el mismo puede ser una tarea desalentadora

Aplicaciones

A menudo, se prefiere utilizar lenguajes de programación funcionales para fines académicos en lugar de desarrollo de software comercial.

No obstante, varios lenguajes de programación destacados que siguen un paradigma de programación funcional, como Clojure, Erlang, F #, Haskell y Racket, se utilizan ampliamente para desarrollar una variedad de aplicaciones comerciales e industriales.

WhatsApp utiliza Erlang, un lenguaje de programación que sigue el paradigma de la programación funcional, para permitir que sus más de 100 empleados manejen los datos que pertenecen a más de 1.500 millones de personas.

Otro portador de la antorcha 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.

Además, el estilo funcional de programación es esencial para que varios lenguajes de programación lideren en dominios distintos. Por ejemplo, R en estadísticas y J, K y Q en análisis financiero.

Algunos elementos de programación funcional incluso son utilizados por lenguajes declarativos específicos de dominio como Lex / Yacc y SQL para evitar valores mutables.

En general, el paradigma de programación funcional se emplea ampliamente en:

Aplicaciones destinadas a la concurrencia o paralelismo
Realización de cálculos matemáticos.

Resumen

Además de los lenguajes de programación funcionales puros, también es posible establecer el enfoque funcional de la programación en lenguajes de programación no funcionales. Hay varios libros disponibles sobre el tema.

C ++ 11, C # 3.0 y Java 8 agregaron construcciones para facilitar el estilo de programación funcional. Uno de los ejemplos más notables de un lenguaje de programación imperativo que utiliza el estilo funcional de programación es el lenguaje de programación Scala .

Aunque típicamente está escrito en un estilo funcional, Scala presenta la presencia de efectos secundarios y estados mutables. Por lo tanto, el lenguaje de programación se puede colocar en un estado intermedio entre los estilos de programación imperativos y funcionales.

Ediciones 2019-20-21