Está en la página 1de 7

Programacion Funcional El objetivo del paradigma funcional es conseguir lenguajes expresivos en los que no sea necesario bajar al nivel

de la mquina para describir el proceso llevado a cabo por el programa, y evitando el concepto de estado del cmputo. La secuencia de computaciones llevadas a cabo por el programa se regira nica y exclusivamente por la reescritura de definiciones ms amplias a otras cada vez ms concretas y definidas, usando lo que se denominan definiciones dirigidas. Otro de los objetivos primordiales de dicho paradigma es buscar satisfacer las necesidades del usuario con respecto a operaciones matemticas y convertirse en un lenguaje ms expresivo. Caractersticas Los programas escritos en un lenguaje funcional estn constituidos nicamente por definiciones de funciones, entendiendo stas no como subprogramas clsicos de un lenguaje imperativo, sino como funciones puramente matemticas, en las que se verifican ciertas propiedades como la transparencia referencial (el significado de una expresin depende nicamente del significado de sus subexpresiones), y por tanto, la carencia total de efectos laterales. Otras caractersticas propias de estos lenguajes son la no existencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteracin (lo que obliga en la prctica a que todas las repeticiones de instrucciones se lleven a cabo por medio de funciones recursivas). Existen dos grandes categoras de lenguajes funcionales: los funcionales puros y los hbridos. La diferencia entre ambos estriba en que los lenguajes funcionales hbridos son menos dogmticos que los puros, al admitir conceptos tomados de los lenguajes procedimentales, como las secuencias de instrucciones o la asignacin de variables. En contraste, los lenguajes funcionales puros tienen una mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se cumple siempre con un lenguaje funcional hbrido. Entre los lenguajes funcionales puros, cabe destacar a Haskell y Miranda. Los lenguajes funcionales hbridos ms conocidos son Lisp, Scheme, Ocaml y Standard ML (estos dos ltimos, descendientes del lenguaje ML). La programacin funcional, es un modelo basado en la evaluacin de funciones matemticas, entendidas como mecanismos para aplicar ciertas operaciones sobre algunos valores o argumentos, para obtener un resultado o valor de la funcin para tales argumentos. Sin embargo, tanto argumentos como resultado de una funcin, pueden ser otra funcin, o incluso la misma, tal como una forma de recursividad, que constituye una poderosa herramienta de la programacin funcional

Historia programacin funcional Sus orgenes provienen del Clculo Lambda (o -clculo), una teora matemtica elaborada por Alonso Church como apoyo a sus estudios sobre Computabilidad. Un lenguaje funcional es, a grandes rasgos, un azcar sintctico del Clculo Lambda. Clculo Lambda Los orgenes tericos del modelo funcional se remontan a la dcada del 30, mas precisamente al ao 1934, cuando Alonso Church introdujo un modelo matemtico de computacin llamado lambda calculo. A pesar de que en esta poca las computadoras aun no existan el lambda clculo se puede considerar como el primer lenguaje funcional de la historia y sus fundamentos fueron la base de toda la teora de la programacin funcional y de los lenguajes funcionales desarrollados posteriormente. Se puede decir que los lenguajes funcionales modernos son versiones de lambda clculo con numerosas ayudas sintcticas. Aunque cuando aparece el clculo lambda, an no existan las computadoras, resulta ser una herramienta simple que se adelanta a su poca, que abarca dos operaciones: Definir alguna(s) funcin(es) de un solo argumento y con un cuerpo especfico, denotado por la siguiente terminologa: lx.B, en donde: x: Define el parmetro o argumento formal. B: Representa el cuerpo de la funcin. Es decir f(x) = B. REDUCCION: Consiste en aplicar alguna de las funciones creadas, sobre un argumento real (A); resultado de sustituir las ocurrencias del argumento formal (x), que aparezcan en el cuerpo (B) de la funcin, con el argumento (A), es decir: (lx.B) Ejemplo: (lx.(x+5))3, indica que en la expresin x + 5, debemos sustituir el valor de x por 3. Cuando ya no es posible reducir una funcin, se dice que sta se encuentra en su estado normal, o sea hemos encontrado el valor de la funcin, que depender nicamente de los argumentos y siempre tendr la consistencia de regresar el mismo valor para los mismos argumentos. Lo anterior es la transferencia referencial y al no contar con variables globales, permiten al sistema la ejecucin de procesos en forma paralela para incrementar su eficiencia. Sobre estos simples conceptos est basada la programacin funcional, aunque existen otros, usados para identificarla y aumentan su potencial en el desarrollo de aplicaciones.

Lenguajes Funcionales Los matemticos desde hace un buen tiempo estn resolviendo problemas usando el concepto de funcin. Una funcin convierte ciertos datos en resultados. Si supiramos cmo evaluar una funcin, usando la computadora, podramos resolver automticamente muchos problemas. As pensaron algunos matemticos, que no le tenan miedo a la mquina, e inventaron los lenguajes de programacin funcionales. Adems, aprovecharon la posibilidad que tienen las funciones para manipular datos simblicos, y no solamente numricos, y la propiedad de las funciones que les permite componer, creando de esta manera, la oportunidad para resolver problemas complejos a partir de las soluciones a otros ms sencillos. Tambin se incluy la posibilidad de definir funciones recursivamente. Un lenguaje funcional ofrece conceptos que son muy entendibles y relativamente fciles de manejar para todos los que no se durmieron en las clases de matemticas. El lenguaje funcional ms antiguo, y seguramente el ms popular hasta la fecha, es LISP, diseado por McCarthy [1] en la segunda mitad de los aos 50. Su rea de aplicacin es principalmente la Inteligencia Artificial. En la dcada de los 80 hubo una nueva ola de inters por los lenguajes funcionales, aadiendo la tipificacin y algunos conceptos modernos de modularizacin y polimorfismo, como es el caso del lenguaje ML. Programar en un lenguaje funcional significa construir funciones a partir de las ya existentes. Por lo tanto es importante conocer y comprender bien las funciones que conforman la base del lenguaje, as como las que ya fueron definidas previamente. De esta manera se pueden ir construyendo aplicaciones cada vez ms complejas. La desventaja de este modelo es que resulta bastante alejado del modelo de la mquina de von Neumann y, por lo tanto, la eficiencia de ejecucin de los intrpretes de lenguajes funcionales no es comparable con la ejecucin de los programas imperativos precompilados. Para remediar la deficiencia, se est buscando utilizar arquitecturas paralelas que mejoren el desempeo de los programas funcionales, sin que hasta la fecha estos intentos tengan un impacto real importante. Los dos mecanismos bsicos presentados anteriormente se corresponden con los conceptos de abstraccin funcional y aplicacin de funcin; si le agregamos un conjunto de identificadores para representar variables se obtiene lo mnimo necesario para tener un lenguaje de programacin funcional. Lambda calculo tiene el mismo poder computacional que cualquier lenguaje imperativo tradicional. Las ventajas de tener un lenguaje tan simple son:

Permite definiciones simples. Facilita el estudio de aspectos computacionales. Su carcter formal facilita la demostracin de propiedades.

Aplicaciones

Compilacin de lenguajes funcionales. Especificar semntica a lenguajes imperativos. Formalismo para definir otras teoras.

Haskell
Haskell es un lenguaje de programacin puramente funcional. En los lenguajes imperativos obtenemos resultados dndole al computador una secuencia de tareas que luego ste ejecutar. Mientras las ejecuta, puede cambiar de estado. Por ejemplo, establecemos la variable aa 5, realizamos algunas tareas y luego cambiamos el valor de la variable anterior. Estos lenguajes poseen estructuras de control de flujo para realizar ciertas acciones varias veces (for, while...). Con la programacin puramente funcional no decimos al computador lo que tiene que hacer, sino ms bien, decimos como son las cosas. El factorial de un nmero es el producto de todos los nmeros desde el 1 hasta ese nmero, la suma de una lista de nmeros es el primer nmero ms la suma del resto de la lista, etc. Expresamos la forma de las funciones. Adems no podemos establecer una variable a algo y luego establecerla a otra cosa. Si decimos que a es 5, luego no podemos decir que es otra cosa porque acabamos de decir que es 5 Acaso somos unos mentirosos? De este modo, en los lenguajes puramente funcionales, una funcin no tiene efectos secundarios. Lo nico que puede hacer una funcin es calcular y devolver algo como resultado. Al principio esto puede parecer una limitacin pero en realidad tiene algunas buenas consecuencias: si una funcin es llamada dos veces con los mismos parmetros, obtendremos siempre el mismo resultado. A esto lo llamamos transparencia referencial y no solo permite al compilador razonar acerca de el comportamiento de un programa, sino que tambin nos permite deducir fcilmente (e incluso demostrar) que una funcin es correcta y as poder construir funciones ms complejas uniendo funciones simples. Haskell es perezoso. Es decir, a menos que le indiquemos lo contrario, Haskell no ejecutar funciones ni calcular resultados hasta que se vea realmente forzado a hacerlo. Esto funciona muy bien junto con la transparencia referencial y permite que veamos los programas como una serie de transformaciones de datos. Incluso nos permite hacer cosas interesantes como estructuras de datos infinitas. Digamos que tenemos una lista de nmeros inmutables xs = [1,2,3,4,5,6,7,8] y una funcin doubleMe que multiplica cada elemento por 2 y devuelve una nueva lista. Si quisiramos multiplicar nuestra lista por 8 en un lenguaje imperativo he hiciramos doubleMe(doubleMe(doubleMe(xs))), probablemente el computador recorrera la lista, hara una copia y devolvera el valor. Luego, recorrera otras dos veces ms la lista y devolvera el valor final. En un lenguaje perezoso, llamar a doubleMe con una lista sin forzar que muestre el valor acaba con un programa dicindote Claro claro, luego lo hago!. Pero cuando quieres ver el resultado, el primer doubleMe dice al segundo que quiere el resultado, ahora! El segundo dice al tercero eso mismo y ste a regaadientes devuelve un 1 duplicado, lo cual es un 2. El segundo lo recibe y devuelve un 4 al primero. El primero ve el resultado y dice que el primer elemento de la lista es un 8. De este modo, el computador solo hace un recorrido a travs de la lista y solo cuando lo necesitamos. Cuando queremos calcular algo a partir de unos datos iniciales en un lenguaje perezoso, solo tenemos que tomar estos datos e ir transformndolos y moldendolos hasta que se parezcan al resultado que deseamos.

Haskell es un lenguaje tipificado estticamente. Cuando compilamos un programa, el compilador sabe que trozos del cdigo son enteros, cuales son cadenas de texto, etc. Gracias a esto un montn de posibles errores son capturados en tiempo de compilacin. Si intentamos sumar un nmero y una cadena de texto, el compilador nos regaar. Haskell usa un fantstico sistema de tipos que posee inferencia de tipos. Esto significa que no tenemos que etiquetar cada trozo de cdigo explcitamente con un tipo porque el sistema de tipos lo puede deducir de forma inteligente. La inferencia de tipos tambin permite que nuestro cdigo sea ms general, si hemos creado una funcin que toma dos nmeros y los suma y no establecemos explcitamente sus tipos, la funcin aceptar cualquier par de parmetros que acten como nmeros. Haskell es elegante y conciso. Se debe a que utiliza conceptos de alto nivel. Los programas Haskell son normalmente ms cortos que los equivalentes imperativos. Y los programas cortos son ms fciles de mantener que los largos, adems de que poseen menos errores. Haskell fue creado por unos tipos muy inteligentes (todos ellos con sus respectivos doctorados). El proyecto de crear Haskell comenz en 1987 cuando un comit de investigadores se pusieron de acuerdo para disear un lenguaje revolucionario. En el 2003 el informe Haskell fue publicado, definiendo as una versin estable del lenguaje.

http://www.monografias.com/trabajos30/paradigma-funcional/paradigmafuncional.shtml#histor http://www.lcc.uma.es/~blas/pfHaskell/gentle/intro.html http://www2.ucsp.edu.pe/~apaz/apuntes/