Programación funcional
Últimamente se ha puesto de moda la “programación funcional”. En este artículo voy a intentar explicar lo que es, con ejemplos.
Parece mentira que siempre volvamos a los orígenes.
Qué es
Existen 3 paradigmas distintos de programación: estructurada, orientada a objetos y funcional.
En el jurásico de la informática la gente escribía el código como le venía en gana, usando el famoso GO TO cada vez que quería reutilizar código. Claro, en esta época había mogollón de ensamblador… Hasta que llegó Dijstra y puso un poco de orden, tachando al GO TO de poco menos que blasfemia.
Pero… si no se puede usar el GO TO, ¿cómo reutilizamos el código? Pues fácil: mediante el uso de funciones. Y así nace la programación estructurada. En mi opinión, esto debería llamarse “desestructurada” y dejar la estructura para cuando comienzan a utilizarse TADs (Tipos Abstractos de Datos) pero, en fin, yo no tengo voz ni voto.
Por esa misma época, quizá incluso algo antes, a alguien se le ocurrió comparar las funciones informáticas con las funciones matemáticas. Pero no se le hizo demasiado caso.
Dado que todos los programadores terminaban utilizando variables globales para poder almacenar estados, a alguien se le ocurrió que se podían agrupar esos estados con algunas funciones. Y así nació la programación orientada a objetos, que no es más que un TAD bien organizado.
Muchos años después, alguien volvió la vista atrás y recordó que otro alguien había pensado en una forma de programar basada en las matemáticas, y decidió echarle un ojo. Y aquéllo no estaba tan mal. La idea era no tener estados (justo lo contrario de la orientación a objetos), y es lo que se llama programación funcional.
En qué consiste
Se trata justamente de eso, de no guardar estados. La mayor crítica que reciben las técnicas de pruebas es que es difícil. Probar un objeto que tiene estados es difícil, ya que cualquier alteración en su estado puede provocar que, ante los mismos parámetros, el resultado sea diferente.
La programación funcional defiende que, si no hay estados, una función debería devolver siempre el mismo resultado ante los mismos parámetros.
Esto tiene una implicación: la única manera de evitar tener estados es no utilizar la asignación. Si no hay asignaciones, no hay estados.
¿De verdad se puede programar así?
Pues es muy curioso, ya que hay muchos lenguajes que lo soportan: Lisp, Haskell, Erlang, Ruby, Python,… Algunos de ellos, como Haskell, son funcionales puros. Lisp (acrónimo de “LISt Processor”) trabaja con listas, y lo hace de una manera funcional.
Debo decir que, habitualmente, resulta complicado de primeras entender un programa escrito de esta manera, aunque a la larga resulta mucho más natural.
Ponme un ejemplo
Iba a poner un ejemplo… Pero he descubierto que puedo poner muchos: todas las funciones built-in de Python están escritas de esta manera. Sobre todo las de Python 3.