You are on page 1of 10

Introduccin

Los muchos lenguajes de programacin existentes se pueden clasificar segn el estilo de


programacin que soporta. Los principales estilos (tambin llamado paradigmas) de
programacin son el imperativo, el orientado a objetos y el declarativo. Generalmente, el
estilo orientado a objetos aparece en lenguajes de base imperativa, enriquecidos con las
nociones de objeto, clase y herencia.

El estilo declarativo es muy diferente del imperativo, y bastante prximo al nivel de


abstraccin de los lenguajes de especificacin, incluye los lenguajes de programacin
funcional y los de programacin lgica.

PROGRAMACIN IMPERATIVA

El primer paradigma que se suele estudiar es el paradigma imperativo. Este paradigma


entiende que para resolver un problema se deben realizar una serie de pasos y el
programador es el encargado de describir de forma ordenada y sistemtica los pasos que
debe seguir el ordenador para obtener la solucin.

Ejemplos de lenguajes imperativos, si bien hay muchos ms, son:

BASIC
Lenguaje de programacin C
Fortran
Pascal
Perl
PHP

PROGRAMACIN DECLARATIVA

El paradigma declarativo, en cambio, plantea que los problemas sean descritos al ordenador
con una serie de unidades conceptuales bsicas que se pueden combinar segn unas
determinadas reglas para generar nueva informacin. Para la resolucin de un problema, se
crearn las descripciones que representan al dominio en el cual existe el problema a resolver
y se plantear el problema como una pregunta que debe ser respondida bien con alguna de
las unidades conceptuales iniciales o bien con una combinacin vlida de ellas que es el
propio ordenador quien debe buscar.

Las unidades conceptuales para la descripcin del problema dependern del subparadigma
de la programacin declarativa: programacin funcional y programacin lgica.

En programacin lgica, la unidad conceptual bsica ser el predicado lgico y en


programacin funcional ser la funcin.
Ventajas de la programacin declarativa:

o Descripciones compactas y muy expresivas. Es posible describir universos de


problemas con muy pocas lneas de cdigo del lenguaje que permitan la solucin de
un gran nmero de problemas.
o Desarrollo del programa no tan orientado a la solucin de un nico problema. Con
una programacin adecuada, basta haber descrito un dominio de problemas de
forma correcta y saber formular nuestro problema como una simple consulta en
dicho dominio. La variedad de preguntas que se pueden responder con una nica
descripcin del dominio de problemas concreto suele ser muy elevada.
o No hay necesidad de emplear esfuerzo en disear un algoritmo que resuelva el
problema

Orgenes de la programacin funcional

Los orgenes de la programacin funcional pueden rastrearse al matemtico Alonzo Church,


que trabajaba en la Universidad de Princeton, y, al igual que otros matemticos de all, estaba
interesado en la matemtica abstracta, particularmente en el poder computacional de
ciertas mquinas abstractas. Las preguntas que se haca eran por ejemplo: si dispusisemos
de mquinas de un ilimitado poder de cmputo, qu tipos de problemas se podran
solucionar?, o se pueden resolver todos los problemas? Para contestar este tipo de
preguntas, Church desarroll un lenguaje abstracto, denominado Clculo Lambda, que el cual
slo realizaba evaluacin de expresiones usando funciones como mecanismo de cmputo.
Este lenguaje abstracto no tena en cuenta limitaciones concretas de implementacin de
ningn tipo. Al mismo tiempo que Church, otro matemtico, Alan Turing, desarroll una
mquina abstracta para intentar resolver el mismo tiempo de problemas planteados por
Church. Despus se demostr que ambos enfoques son equivalentes.

Las primeras computadoras digitales se construyeron siguiendo un esquema de arquitectura


denominado de Von Neumann, que es bsicamente una implementacin de la mquina de
Turing a una mquina real. Esta mquina forz de alguna manera el lenguaje en el cual se
escriben sus programas, justamente el paradigma procedimental, el cual, como menciona
Backus en un muy famoso artculo que escribi al recibir el premio Turing en 1978 (Backus
1978), tiene tantsimos defectos, que muchos programadores padecemos aun hoy. La
programacin funcional se aparta de esta concepcin de mquina, y trata de ajustarse ms
a la forma de resolver el problema, que a las construcciones del lenguaje necesarias para
cumplir con la ejecucin en esta mquina. Por ejemplo, un condicionamiento de la mquina
de Von-Neumann es la memoria, por lo cual los programas procedimentales poseen
variables. Sin embargo en la programacin funcional pura, las variables no son necesarias, ya
que no se considera a la memoria necesaria, pudindose entender un programa como una
evaluacin continua de funciones sobre funciones. Es decir, la programacin funcional posee
un estilo de computacin que sigue la evaluacin de funciones matemticas y evita los
estados intermedios y la modificacin de datos durante la misma. Hoy en da existen diversos
lenguajes funcionales. Se podra considerar como uno de los primeros lenguajes funcionales
al LISP, que actualmente sigue en uso, sobre todo en reas de la inteligencia artificial.
Tambin un pionero de este paradigma es APL desarrollado en los aos 60 (Iverson 1962). El
linaje funcional se enriqueci en los aos 70, con el aporte de Robin Milner de la Universidad
de Edimburgo al crear el lenguaje ML. ste se subdividi posteriormente en varios dialectos
tales como Objective Caml y Standard ML. A fines de los aos 80, a partir de un comit, se
cre el lenguaje Haskell, en un intento de reunir varias ideas dispersas en los diferentes
lenguajes funcionales (un intento de estandarizar el paradigma). Este ao Microsoft Research
ha incluido un nuevo lenguaje (funcional), denominado F#, a su plataforma .NET. La Figura
siguiente compara grficamente ambos paradigmas.

Programacin funcional
En la prctica, la diferencia entre una funcin matemtica y la nocin de una "funcin"
utilizada en la programacin imperativa, es que las funciones imperativas pueden tener
efectos secundarios, como cambiar el valor de clculos realizados previamente. Por esta
razn carecen de transparencia referencial, es decir, la misma expresin sintctica puede
resultar en valores diferentes en varios momentos de la ejecucin del programa. Con cdigo
funcional, en contraste, el valor generado por una funcin depende exclusivamente de los
argumentos alimentados a la funcin. Al eliminar los efectos secundarios se puede entender
y predecir el comportamiento de un programa mucho ms fcilmente. sta es una de las
principales motivaciones para utilizar la programacin funcional.
Los lenguajes de programacin funcional, especialmente los puramente funcionales, han
sido enfatizados en el ambiente acadmico y no tanto en el desarrollo comercial o industrial.
Sin embargo, lenguajes de programacin funcional como Scheme, Erlang, Rust, Objective
Caml , Scala, F# y Haskell, han sido utilizados en aplicaciones comerciales e industriales por
muchas organizaciones. La programacin funcional tambin es utilizada en la industria a
travs de lenguajes de dominio especfico como R (estadstica), Mathematica (matemticas
simblicas), J y K (anlisis financiero).
Los lenguajes de uso especfico usados comnmente como SQL y Lex/Yacc, utilizan algunos
elementos de programacin funcional, especialmente al procesar valores mutables. Las
hojas de clculo tambin pueden ser consideradas lenguajes de programacin funcional.
La programacin funcional tambin puede ser desarrollada en lenguajes que no estn
diseados especficamente para la programacin funcional. En el caso de Perl, por ejemplo,
que es un lenguaje de programacin imperativo, existe un libro que describe cmo aplicar
conceptos de programacin funcional. JavaScript, uno de los lenguajes ms ampliamente
utilizados en la actualidad, tambin incorpora capacidades de programacin
funcional. Python tambin incorpora particularidades de los lenguajes funcionales como
listas de comprensin y funciones de tratamiento de listas como matemtica de conjuntos.
Java en su versin 8, est incorporando la programacin funcional, as como el uso de las
expresiones lambda.

Caractersticas de los lenguajes funcionales

Las funciones definidas en un lenguaje imperativo pueden causar efectos colaterales. Por
ejemplo la siguiente funcin pascal incrementa en 1 el valor de la variable global m cada vez
que es ejecutada:

Los efectos colaterales hacen impredecible el comportamiento de los programas. Por


ejemplo, los dos fragmentos de cdigo Pascal que se muestran ms abajo parecen
equivalentes a primera vista. Sin embargo debido al efecto sobre m causado por la evaluacin
de siguiente(x), el valor final de la variable y es 1 tras la ejecucin del primer fragmento de
cdigo, y 2 tras la ejecucin del segundo fragmento.

En leguajes funcionales puros como Haskell, no existe la asignacin destructiva. Por este
motivo, las variables se comportan como en matemticas. No cambian de valor, y el
resultado de evaluar una expresin cualquiera siempre es el mismo, independientemente
del orden de evaluacin. Otras caractersticas importantes de los lenguajes funcionales
puros son:
Nivel de abstraccin alto: los programas estn prximos a la lgica de los problemas
a resolver, ignorando los detalles de bajo nivel. Las ecuaciones de un programa sirven
para calcular y tambin razonar.
Disciplina esttica de tipos: los errores debidos a tipos incorrectos se detectan antes
de la ejecucin.
Polimorfismo: se pueden programar funciones que operan para datos de cualquier
tipo. Por ejemplo, la funcin que calcula la longitud de una lista no depende del tipo
de elementos.
Funciones de orden superior: se permite que los parmetros y/o el resultado de una
funcin f sean a su vez funciones. En este caso, se dice que f es una funcin de orden
superior.
Evaluacin perezosa: al calcular el valor de una expresin, se evitan automticamente
todos los clculos innecesarios.
Gestin automtica de la memoria: la memoria que se va necesitando para el
cmputo es asignada automticamente en tiempo de ejecucin. Una sistema de
recogida de basura (gargage collection) recupera automticamente la memoria
asignada que deja de ser necesaria.

Fundamentos slidos
La Programacin Funcional est apoyada en dos pilares matemticos potentes:
el lambda-clculo
Es un sistema formal que describe el clculo en trminos una abstraccin de las funciones y
su aplicacin. En las matemticas aprendidas en el cole denotamos las funciones de un modo
que se presta a cierta ambigedad. Una funcin que eleva un nmero a su cuadrado se
denota con f(x) = x 2. La aplicacin de la funcin se denota encerrando el argumento entre
parntesis. As, f(2) es la aplicacin de la funcin al valor 2. La ambigedad surge al usar la
expresin f(x). Nos referimos a la funcin f o a su aplicacin a una variable x que puede tener
un valor determinado? El lambda-clculo evita esta y otras ambigedades. Va ms all de la
notacin: es un sistema formal.
En lambda-clculo, la funcin que calcula el cuadrado de un nmero se denota as: x.x2 La
aplicacin de la funcin se denota poniendo el valor a continuacin de la funcin (x.x2 ) 2 =4
Ntese que no hacen falta parntesis que encierren el argumento y que no hay confusin
posible en el caso de una expresin como (x.x2 ) x La x que aparece junto a denota el
parmetro, la x en el cuerpo de la funcin, tambin. La ltima x ha de ser una variable que
tiene valor y es ese valor el que suministramos como argumento. Solo hay tres
construcciones en lambda-clculo:
Nombre: proporciona un valor (ejemplo: x)
Definicin de una funcin con un parmetro (ejemplo: x.2x)
Aplicacin de una funcin a un valor (ejemplo: x.2x)

La teora de categoras
La teora de categoras es una rama de las matemticas que estudia estructuras que surgen
en colecciones de objetos y flechas entre ellos (o morfismos). Es una especie de herramienta
de abstraccin capaz de dar resultados en teora de conjuntos, de anillos, de grupos En el
campo de la computacin los objetos son tipos de datos y los morfismos son funciones. A la
teora de categoras se la conoce, en broma, como general abstract nonsense. Parece una
mera presentacin taxonmica de estructuras formadas por conjuntos, operaciones y leyes,
con conceptos ms y ms abstractos. La abstraccin dificulta percibir la posible aplicacin
prctica. Algunos conceptos tiles son los monoides, los functores, los functores aplicativos
y las mnadas. Explicados en abstracto, parecen completamente absurdos.
Un functor es una transformacin que preserva, en cierto sentido, la estructura. Transformar
los elementos de una lista (o de un rbol) de modo que alteremos su valor pero no la
secuencia y nmero de nodos (o las relaciones padres-hijos) es una operacin frecuente en
programacin, y el hecho de que esa operacin exista hace que la lista (o el rbol) sea un
functor. Ver la lista (o el rbol) como un functor ayuda a utilizar ciertos resultados abstractos
de la teora de categoras y a conocer las limitaciones de lo que se puede hacer con ellos.
Haskell modela la clase Functor y ofrece una funcin capaz de efectuar las transformaciones
propias de un functor (es la funcin u operador fmap, que eleva una funcin de un tipo a
otro a una funcin del functor de un tipo al functor del otro tipo; como ves, general abstract
nonsense).
Las mnadas son uno de los conceptos de la teora de categoras que se han puesto de moda.
Nos permiten, por ejemplo, trabajar en un lenguaje funcional puro con un estilo imperativo.
Haskell ofrece una notacin especial para tratar con mnadas y hacer ms legibles los
programas que las usan. La entrada/salida en Haskell, por ejemplo, es mondica.

Ventajas de la programacin Funcional

Ventajas que ofrece la programacin funcional en Haskell, que es el lenguaje funcional ms


puro en la zona pragmtica o utilizable en el mundo real:
Transparencia referencial: El resultado de una funcin depende nica y exclusivamente de
sus datos de entrada. Eso implica que no puede haber un estado que modifique el
comportamiento de la funcin. Una consecuencia es que simplifica el diseo de pruebas
unitarias (si es que sueles trabajar con TDD).
Sin efectos secundarios (implcitos) y con sintaxis de apoyo para uso de mnadas: Del
mismo modo que una funcin no depende del estado global, una funcin no puede modificar
el estado global. Esto parece chocar con la esencia de la entrada/salida que, por naturaleza,
genera efectos secundarios en el mundo o modifica los clculos por la aparicin de datos de
la nada (es decir, no como valor que ingresa en el sistema como argumento de llamada a
funcin). Pero Haskell las supera con un modelado que hace explcito, en trminos
mondicos, esa entrada/salida como el resultado del clculo de un estado del mundo a
partir de un estado del mundo previo.
Evaluacin no estricta (con tcnica perezosa), sin orden de evaluacin y estructuras
infinitas: La evaluacin perezosa permite que no se ejecute ms clculo que el necesario para
alcanzar un resultado. Las estructuras infinitas plantean problemas de terminacin de
clculo en lenguajes imperativos que desaparecen con la evaluacin perezosa: por infinitos
valores que tenga una estructura, en un clculo finito solo emplearemos una cantidad finita
de ellos y sern esos los nicos que se acaben calculando realmente.
Funciones currificadas, de primera clase, de orden superior: En Haskell todo son funciones.
Las funciones son valores y las funciones admiten funciones como argumentos y pueden
devolver funciones como resultado. La currificacin de funciones (todas tienen un solo
parmetro porque las que parecen tener ms de uno son, en realidad, funciones que
devuelven funciones) permite expresar concisamente ciertas composiciones de funciones.
Tipado esttico (con types y kinds) e inferencia de tipos: En Haskell es frecuente decir si
compila, funciona. El tipado nos ayuda enormemente, especialmente en la refactorizacin
de cdigo. Adems, no es muy intrusivo porque la inferencia hace innecesario declarar los
tipos (salvo para resolver alguna ambigedad por excesiva generalizacin). Solemos declarar
tipos de funciones o variables para documentar el cdigo.
Eliminacin de recursin por cola: La recursin por cola no consume memoria proporcional
al nmero de llamadas. Ello permite montar eficientemente clculos recursivos.
Coleccin de libreras con potentes abstracciones funcionales: Hackage contienen muchas
libreras que implementan algunas de las construcciones abstractas que encontrars en los
aspectos ms formales y tericos de la programacin funcional. Son libreras altamente
reutilizables una vez entiendes qu constructos modelan.
Tipos de datos algebraicos: Los tipos de datos algebraicos permiten modelar sumas y
productos de tipos de datos. Evitan mucha de la complejidad de la orientacin a objetos y su
aprendizaje puede recompensar, tambin, al usar un lenguaje orientado a objetos.
Concordancia de patrones (pattern matching): los datos se pueden deconstruir sobre la
marcha para definir casos en los que podemos aplicar ciertas definiciones de funciones o
para seleccionar la expresin ms adecuada en un contexto determinado. El resultado son
programas muy expresivos y legibles, con un estilo declarativo.
Todo el programa se reduce a la evaluacin e una (mega) expresin para obtener un valor:
no hay estructuras de control de flujo porque no hay flujo que controlar!
Libreras con colecciones inmutables. El diseo de programas en el que los datos no mutan
fuerza a operar con estructuras de datos de modo que cada cambio genera una copia de la
estructura con la modificacin, a la vez que la estructura original sigue estando disponible.
Inconvenientes de la Programacin Funcional
La programacin funcional tiene inconvenientes, algunos de ellos son:

Exotismo: el estilo es menos conocido que el imperativo. Hace falta un esfuerzo para
adaptarse a una nueva manera de pensar
Ineficiencia: los programas funcionales no permiten controlar detalles de bajo nivel.
En general, su ejecucin es ms lenta y consume ms memoria que el imperativo.
Comportamiento complejo: la evaluacin perezosa efecta los clculos en un orden
difcil de predecir. Esto no dificulta la programacin en s misma, pero s dificulta el
anlisis de la eficiencia de los programas. A veces es difcil estimar el tiempo y el
espacio requerido para el cmputo.
Falta de apoyo de los usuarios: las implementaciones existentes de lenguajes
funcionales en general carecen de un entorno de programacin que facilite el
desarrollo y mantenimiento de programas. En particular, faltan herramientas que
soporten la depuracin, la evaluacin del rendimiento y la transformacin de
programas.
Condiciones de la Programacin funcional:
- El sistema de tipos es esttico.
- No puedes usar bucles ni, en general, estructuras de control de flujo.
- Las funciones tienen un nico parmetro.
- Cada funcin consta de una sola expresin.
- Las funciones no tiene efectos secundarios y, dada una entrada, siempre producen el
mismo resultado y nada ms que ese resultado
- Una vez se asigna un valor a un identificador, no se puede modificar.
- Las operaciones sobre estructuras de datos son no destructivas, es decir, puedo
disponer de la versin de la estructura de datos previa a la operacin y la versin
posterior a la misma.
- El orden de ejecucin de las diferentes expresiones no importa.
Conclusin:
La programacin funcional lleva muchos aos entre nosotros, pero siempre se asociaba ms
a entornos acadmicos que a empresariales y productivos. Es algo que parece que empieza
a cambiar y muchas empresas, algunas muy importantes, estn apostando fuerte por este
paradigma.
Una de las razones puede ser que las aplicaciones son cada vez ms difciles de ejecutar en
una sola mquina. Cada vez es ms necesario poder soportar grandes dosis de concurrencia
y paralelismo. No obstante el hardware actual, nos proporciona unas capacidades de
paralelismo nunca vistas, y la nube hace cada vez ms sencillo (y barato) construir sistemas
distribuidos en distintos servidores. Y claro, para tareas como estas, un lenguaje funcional
puede desenvolverse con mayor eficiencia.
Est claro tambin, que la programacin funcional tiene conceptos muy interesantes, tanto
que muchos lenguajes no funcionales estn poco a poco adoptndolos. Las ltimas versiones
de Java ya incluyen expresiones lambda, cosa ya incluida C# hace mucho tiempo. Cada
versin de C# incluye ms caractersticas funcionales y de hecho en su ltima versin, la 7,
incluye el concepto funcional del pattern matching. Ruby, Python o Go, son otros lenguajes
que incorporan algunas caractersticas funcionales.
Tampoco debemos olvidar JavaScript, que tiene muchos conceptos funcionales desde hace
tiempo (funciones annimas, funciones como miembros de primera clase etc.). Al ser uno de
los lenguajes ms populares, es fcil que estos conceptos lleguen cada vez a ms
programadores, haciendo que la revolucin funcional llegue un poquito ms lejos.
Pero esto no acaba aqu, ya que a los viejos lenguajes funcionales, se estn aadiendo
muchos nuevos lenguajes, con muchas otras caractersticas modernas. Es el caso de Elixir,
Clojure, Scala o Elm, por citar algunos.
Aunque es cierto que los programadores vivimos muchas veces de las modas, tambin es
cierto que una mala herramienta rara vez llega a ser popular. As que si la programacin
funcional est recibiendo ms atencin ser por algo. Estas son algunas de las supuestas
ventajas que podemos obtener:
- El cdigo tiende a ser ms conciso y expresivo
- Que el estado sea inmutable, evita muchos errores ya que no hay efectos secundarios
- Que el estado sea inmutable, nos ayuda en sistemas concurrentes o paralelos
- Las funciones reciben parmetros y devuelven un resultado, por lo que son siempre
previsibles (si son funciones puras).
- El testing tiende a ser ms sencillo, ya que si escribimos funciones puras, los
resultados son ms previsibles.
De todas maneras, aunque esas ventajas no sean suficientes, aunque en nuestro da a da
usemos otro tipo de lenguajes, es muy recomendable aprender otros paradigmas de
programacin. Nos abre la mente a ideas nuevas, y eso nos hace mejores programadores. Y
es que a veces, enriquece mucho ms aprender un lenguaje nuevo, que aprender ms cosas
del lenguaje que usamos todos los das.
Referencias:
http://www.ucasal.edu.ar/htm/ingenieria/cuadernos/archivos/3-p63-Rivadera.pdf
https://es.wikipedia.org/wiki/Programaci%C3%B3n_funcional
Programacion Funcional - Rodriguez Artalejo
Introduccion a la programacion declarativa- CARPIO
Por qu deberas aprender programacin funcional ya mismo de Andrs Marzal

Describa el proceso de reduccin de expresiones.


Compare funciones monomrficas con funciones polimrficas.
Cmo evala una expresin el lenguaje Haskell teniendo en cuenta patrones y evaluacin
perezosa? Exponga los conceptos utilizando ejemplos.
Analice la clase Functor. Qu relacin existe entre functor y nmada?
Qu es una funcin de orden superior en la programacin funcional?
Explique el concepto de parcializacin.

You might also like