Programación funcional

El profesor de la asignatura de Lenguajes de Programación nos mandó hacer un trabajo para esta semana sobre distintos paradigmas de programación: Objetos, Funcional y Lógico. Cada alumno teníamos que escoger un lenguaje distinto de un paradigma y los que fuesen del mismo, hacer una presentación conjunta sobre el paradigma.

Yo me decanté por los lenguajes funcionales, porque ya sé Programación Orientada a Objetos y la Lógica no me atrae demasiado por ahora. Los funcionales, sin embargo, parecen bastante interesantes.

La característica fundamental de este paradigma es, obviamente, el uso de las funciones, pero no las que generalmente se denominan así (o métodos, procedimientos, etc.)  en la programación imperativa, sino que son más similares a las funciones matemáticas.

Esto es así porque cumplen la propiedad de la Transparencia Referencial, la cual dice, a grosso modo, que el valor devuelto por una función depende únicamente de los argumetnos con los que es llamada, y no de la historia del programa. Esta característica es fácilmente emulable en la programación imperativa prescindiendo del uso y modificación de variables globales. En los lenguajes funcionales es así siempre.

Los lenguajes más estrictos carecen de las estructuras iterativas clásicas, teniendo que utilizar la recursividad para resolver problemas que requieran repetición. Aunque algunos puedan disponer de las estructuras habituales, apenas se utilizan dado que la recursividad siempre se ha considerado una solución mucho más elegante y lógica que los bucles.

Aquí volvemos a acercarnos a las matemáticas, donde existen muchas ecuaciones en forma recursiva:

  • La Sucesión de Fibonacci, F0=0; f1=1; Fn=Fn-1+Fn-2
  • Factorial, 0!=1, n!=(n-1)!
  • Función de Ackerman

Otra característica muy importante de estos lenguajes es que no suelen trabajar directamente con datos simples como un entero o un booleano, sino que los organizan en colecciones, generalmente de tipo lista o arary.

Estos lenguajes tienen su base en los años 30, cuando Alonzo Church diseñó un sistema formal llamado Lambda-Cálculo para el estudio de las funciones y la recursión. Sólo se basa en tres reglas,  pero a primera vista parece algo complejo y no le he dedicado tiempo suficiente como para hablar de él aquí. Sólo sé que tiene la misma expresividad que una máquina de Turing, es decir, que cualquier algoritmo que pueda ejecutar un humano o una máquina, puede definirse dentro de este sistema.

El primer lenguaje funcional implementado fue LISP, muy influenciado por el λ-Cálculo, del cual, lo más famoso son la cantidad de paréntesis que hay que escribir para codificar cualquier cosa.

Un año antes, Kenneth E. Iverson había inventado una notación para enseñar y estudiar algoritmos y funciones de la computación. Cinco años más tarde la hizo pública y tuvieron que esperarse cinco años más a que se implementara completamente. Se llama APL y es el lenguaje más expresivo que existe. Yo elegí éste para mi presentación (esta versión tiene algún fallo y me hubiera gustado ampliarla con algunas cosas más), y dedicaré más adelante un post completo a él.

Poco después los lenguajes funcionales cayeron en el olvido, hasta que en los años 80 volvieron a atraer la atención de los desarrolladores y todo el mundo decidió crear su propio lenguaje funciónal, provocando la aparición de decenas de ellos (la lista en la Wikipedia es bastante amplia).

En medio de toda esta eclosión, los gurús de los lenguajes fucnionales decidieron juntarse en un congreso y elaborar un lenguaje estandarizado y, más o menos, a gusto de todos. De aquí nació Haskell en 1990, el cual sigue evolucionando.

Otros también conocidos son ML, Scheme, Miranda e incluso las hojas de cálculo tipo Excel podrían englobarse en estos grupos. El entorno matemático R (el que utilicé para el cálculo del Perceptron en mi PFC ) también es un lenguaje funcional (combinado con objetos).

Deja un comentario

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