Programación Funcional

7
Programación funcional Valor de retorno Subrutina o función Parámetros Salida Proceso Entrada Diagrama del funcionamiento de una subrutina. En ciencias de la computación, la programación funcio- nal es un paradigma de programación declarativa basado en la utilización de funciones aritméticas que no mane- ja datos mutables o de estado. Enfatiza la aplicación de funciones, en contraste con el estilo de programación im- perativa, que enfatiza los cambios de estado. La progra- mación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en los años 1930 para investi- gar la definición de función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación fun- cionales pueden ser vistos como elaboraciones del cálculo lambda. En la práctica, la diferencia entre una función matemática y la noción de una “función” utilizada en la programación imperativa es que las funciones imperativas pueden tener efectos secundarios, al cambiar el valor de cálculos rea- lizados previamente. Por esta razón carecen de transpa- rencia referencial, es decir, la misma expresión sintáctica puede resultar en valores diferentes en diferentes momen- tos dependiendo del estado del programa siendo ejecuta- do. Con código funcional, en contraste, el valor generado por una función depende exclusivamente de los argumen- tos alimentados a la función. Al eliminar los efectos se- cundarios se puede entender y predecir el comportamien- to de un programa mucho más fácilmente, y esta es una de las principales motivaciones para utilizar la programa- ción funcional. Los lenguajes de programación funcional, especialmen- te los que son puramente funcionales, han sido enfatiza- dos en el ambiente académico principalmente y no tanto en el desarrollo de software comercial. Sin embargo, len- guajes de programación importantes tales como Scheme, Erlang, Rust, Objective Caml y Haskell, han sido utili- zados en aplicaciones comerciales e industriales por mu- chas organizaciones. La programación funcional también es utilizada en la industria a través de lenguajes de domi- nio específico como R (estadística), Mathematica (mate- máticas simbólicas), J y K (análisis financiero), F# en Mi- crosoft.NET y XSLT (XML). Lenguajes de uso específi- co usados comúnmente como SQL y Lex/Yacc, utilizan algunos elementos de programación funcional, especial- mente al procesar valores mutables. Las hojas de cálculo también pueden ser consideradas lenguajes de programa- ción funcional. La programación funcional también puede ser desarrolla- da en lenguajes que no están diseñados específicamente para la programación funcional. En el caso de Perl, por ejemplo, que es un lenguaje de programación imperativo, existe un libro que describe como aplicar conceptos de programación funcional. JavaScript, uno de los lenguajes más ampliamente utilizados en la actualidad, también in- corpora capacidades de programación funcional. Python también incorpora particularidades de los lenguajes fun- cionales como listas de comprensión y funciones de trata- miento de listas como matemática de conjuntos. Java en su versión 8, esta incorporando la programación funcio- nal, así como el uso de las expresiones lambda. 1 Utilidad El objetivo es conseguir lenguajes expresivos y matemá- ticamente elegantes, en los que no sea necesario bajar al nivel de la máquina para describir el proceso llevado a cabo por el programa, y evitar el concepto de estado del cómputo. La secuencia de computaciones llevadas a ca- bo por el programa se rige única y exclusivamente por la reescritura de definiciones más amplias a otras cada vez más concretas y definidas, usando lo que se denominan “definiciones dirigidas”. 2 Características Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstas no como subprogramas clásicos de un 1

description

Programación Funcional

Transcript of Programación Funcional

Page 1: Programación Funcional

Programación funcional

Valor de retorno

Subrutinao función

Parámetros

Salida

Proceso

Entrada

Diagrama del funcionamiento de una subrutina.

En ciencias de la computación, la programación funcio-nal es un paradigma de programación declarativa basadoen la utilización de funciones aritméticas que no mane-ja datos mutables o de estado. Enfatiza la aplicación defunciones, en contraste con el estilo de programación im-perativa, que enfatiza los cambios de estado. La progra-mación funcional tiene sus raíces en el cálculo lambda, unsistema formal desarrollado en los años 1930 para investi-gar la definición de función, la aplicación de las funcionesy la recursión. Muchos lenguajes de programación fun-cionales pueden ser vistos como elaboraciones del cálculolambda.En la práctica, la diferencia entre una función matemáticay la noción de una “función” utilizada en la programaciónimperativa es que las funciones imperativas pueden tenerefectos secundarios, al cambiar el valor de cálculos rea-lizados previamente. Por esta razón carecen de transpa-rencia referencial, es decir, la misma expresión sintácticapuede resultar en valores diferentes en diferentes momen-tos dependiendo del estado del programa siendo ejecuta-do. Con código funcional, en contraste, el valor generadopor una función depende exclusivamente de los argumen-tos alimentados a la función. Al eliminar los efectos se-cundarios se puede entender y predecir el comportamien-to de un programa mucho más fácilmente, y esta es unade las principales motivaciones para utilizar la programa-ción funcional.Los lenguajes de programación funcional, especialmen-

te los que son puramente funcionales, han sido enfatiza-dos en el ambiente académico principalmente y no tantoen el desarrollo de software comercial. Sin embargo, len-guajes de programación importantes tales como Scheme,Erlang, Rust, Objective Caml y Haskell, han sido utili-zados en aplicaciones comerciales e industriales por mu-chas organizaciones. La programación funcional tambiénes utilizada en la industria a través de lenguajes de domi-nio específico como R (estadística), Mathematica (mate-máticas simbólicas), J y K (análisis financiero), F# enMi-crosoft.NET y XSLT (XML). Lenguajes de uso específi-co usados comúnmente como SQL y Lex/Yacc, utilizanalgunos elementos de programación funcional, especial-mente al procesar valores mutables. Las hojas de cálculotambién pueden ser consideradas lenguajes de programa-ción funcional.La programación funcional también puede ser desarrolla-da en lenguajes que no están diseñados específicamentepara la programación funcional. En el caso de Perl, porejemplo, que es un lenguaje de programación imperativo,existe un libro que describe como aplicar conceptos deprogramación funcional. JavaScript, uno de los lenguajesmás ampliamente utilizados en la actualidad, también in-corpora capacidades de programación funcional. Pythontambién incorpora particularidades de los lenguajes fun-cionales como listas de comprensión y funciones de trata-miento de listas como matemática de conjuntos. Java ensu versión 8, esta incorporando la programación funcio-nal, así como el uso de las expresiones lambda.

1 Utilidad

El objetivo es conseguir lenguajes expresivos y matemá-ticamente elegantes, en los que no sea necesario bajar alnivel de la máquina para describir el proceso llevado acabo por el programa, y evitar el concepto de estado delcómputo. La secuencia de computaciones llevadas a ca-bo por el programa se rige única y exclusivamente por lareescritura de definiciones más amplias a otras cada vezmás concretas y definidas, usando lo que se denominan“definiciones dirigidas”.

2 Características

Los programas escritos en un lenguaje funcional estánconstituidos únicamente por definiciones de funciones,entendiendo éstas no como subprogramas clásicos de un

1

Page 2: Programación Funcional

2 2 CARACTERÍSTICAS

lenguaje imperativo, sino como funciones puramente ma-temáticas, en las que se verifican ciertas propiedades co-mo la transparencia referencial (el significado de una ex-presión depende únicamente del significado de sus subex-presiones), y por tanto, la carencia total de efectos colate-rales.Otras características propias de estos lenguajes son la noexistencia de asignaciones de variables y la falta de cons-trucciones estructuradas como la secuencia o la iteración(lo que obliga en la práctica a que todas las repeticionesde instrucciones se lleven a cabo por medio de funcionesrecursivas).Existen dos grandes categorías de lenguajes funcionales:los funcionales puros y los híbridos. La diferencia entreambos estriba en que los lenguajes funcionales híbridosson menos dogmáticos que los puros, al admitir concep-tos tomados de los lenguajes imperativos, como las se-cuencias de instrucciones o la asignación de variables. Encontraste, los lenguajes funcionales puros tienen una ma-yor potencia expresiva, conservando a la vez su transpa-rencia referencial, algo que no se cumple siempre con unlenguaje funcional híbrido.

2.1 Funciones de primera clase y de ordensuperior

Funciones de orden superior son funciones que puedentomar otras funciones como argumentos o devolverlos co-mo resultados. En cálculo , un ejemplo de una función deorden superior es el operador diferencial d / dx , que de-vuelve la derivada de una función f .Las funciones de orden superior están estrechamente re-lacionadas con las funciones de primera clase en las cua-les las funciones de orden superior y las funciones de pri-mera clase pueden recibir como argumentos y resultadosotras funciones. La distinción entre los dos es sutil: “de or-den superior”, describe un concepto matemático de fun-ciones que operan sobre otras funciones, mientras que la“primera clase” es un término informático que describelas entidades del lenguaje de programación que no tienenninguna restricción de su utilización (por lo tanto funcio-nes de primera clase pueden aparecer en cualquier partedel programa que otras entidades de primer nivel comolos números pueden, incluidos como argumentos a otrasfunciones y como sus valores de retorno).Las funciones de orden superior permiten la aplicaciónparcial, una técnica en la que se aplica una función a susargumentos uno a la vez, con cada aplicación devolveruna nueva función que acepta el siguiente argumento. Es-to le permite a uno expresar, por ejemplo, la función su-cesor como el operador de suma aplicada parcialmente alnúmero natural uno.

2.2 Funciones puras

Las funciones puramente funcionales (o expresiones) notienen efectos secundarios (memoria o E/S). Esto signifi-ca que las funciones puras tienen varias propiedades úti-les, muchas de las cuales pueden ser utilizados para opti-mizar el código:

• Si no se utiliza el resultado de una expresión pura,se puede eliminar sin afectar a otras expresiones.

• Si una función pura se llama con parámetros que nocausan efectos secundarios, el resultado es constantecon respecto a la lista de parámetros (a veces llama-da transparencia referencial), es decir, si la funciónpura se llama de nuevo con los mismos parámetros,el mismo resultado será devuelto (esto puede habili-tar las optimizaciones de almacenamiento en caché).

• Si no hay una dependencia de datos entre dos expre-siones puras, entonces su orden puede ser invertido,o pueden llevarse a cabo en paralelo y que no puedainterferir con los otros.

• Si el lenguaje no permite efectos secundarios, en-tonces cualquier estrategia de evaluación se puedeutilizar, lo que da la libertad al compilador parareordenar o combinar la evaluación de expresionesen un programa (por ejemplo, usando la poda).

La mayoría de los compiladores de lenguajes imperati-vos detectan funciones puras automáticamente y realizanla eliminación de subexpresiones comunes. Sin embar-go no siempre es posible detectarlo en bibliotecas pre-compiladas, porque por norma general no dan esta infor-mación. Esto provoca que no se puedan realizar optimi-zaciones que podrían aplicar a dichas funciones externas.Algunos compiladores, como gcc, sí que añaden palabrasclaves adicionales para que el programador marque ex-plícitamente como puras aquellas funciones externas queproceda, de modo que se le apliquen las optimizacionespertinentes. Fortran 95 también permite que declarar fun-ciones “puras”.

2.3 Recursividad

Iterar en los lenguajes funcionales es normalmente lleva-do a cabo mediante recursividad. Las funciones recursi-vas se invocan a sí mismas, permitiendo que una ope-ración se realice una y otra vez hasta alcanzar el casobase. Aunque algunas recursividades requieren el man-tenimiento de una pila, la recursividad mediante una colapuede ser reconocida y optimizada mediante un compi-lador dentro del mismo código utilizado, para implemen-tar las iteraciones en un lenguaje imperativo. El estándardel esquema del lenguaje requiere implementaciones pa-ra conocer y optimizar la recursividad mediante una co-la. La optimización de la recursividad mediante una cola

Page 3: Programación Funcional

2.5 Tipo de sistemas 3

puede ser implementada transformando el programa a unestilo de pase de continuidad durante la compilación, en-tre otros enfoques.Los patrones comunes de recursividad puede ser factori-zados usando funciones comunes más grandes, con “ca-tamorfismos” y “anamorfismos” (pliegues y despliegues),siendo estos los ejemplos más evidentes. Tal y como lasmayores funciones más comunes tienen un rol análogopara construir estructuras de control se tienen los itera-dores en los lenguajes imperativos.La mayoría de los lenguajes de programación funcionalde propósito general permiten la recursividad sin restric-ciones y superan el test de Turing, lo que hace que el pro-grama que se interrumpe no pueda tomar un decisión, loque puede causar una falta de solidez en el razonamien-to ecuacional y generalmente requiere introducir incon-sistencia dentro de la lógica expresada por los tipos delsistema del lenguaje. Algunos lenguajes de propósito es-pecial como Coq permiten tan sólo recursividad bien fun-damentada y tienen una normalización fuerte(cálculos nofinalizados pueden ser expresados tan sólo con flujos devalores infinitos llamados codata) En consecuencia, es-tos lenguajes fallan el test de Turing y declarar funcionesciertas en ellos es imposible, pero pueden declarar unaamplia clase de cálculos interesantes mientras evitan losproblemas producidos por la recursividad sin restriccio-nes. La programación funcional limitada a la recursividadbien construida con unas cuantas restricciones más se lla-ma programación funcional total.

2.4 Evaluación estricta frente a la no es-tricta

Los lenguajes funcionales pueden ser clasificados porel hecho de usar evaluación estricta(eager) o no estric-ta(lazy), conceptos que hacen referencia a cómo los ar-gumentos de las funciones son procesados cuando unaexpresión está siendo evaluada. La diferencia técnica estáen la notación semántica de las expresiones que contienencálculos fallidos o divergentes. Bajo la evaluación estric-ta, la evaluación de cualquier término que contenga unsub-término fallido hará que este sea de por sí fallido.Por ejemplo, la expresión:print length([2+1, 3*2, 1/0, 5-4])fallará bajo evaluación estricta por la división por ceroen el tercer elemento de la lista. Utilizando evaluación noestricta, el tamaño de la función devolverá un valor de 4(por ejemplo el número de elementos de la lista) ya queevaluar esto no afectará al estar evaluando los que com-ponen la lista. En resumen, la evaluación estricta evalúapor completo los argumentos a menos que sus valores re-quieran evaluar la propia función que se llama a sí misma.La implementación de la estrategia común para evalua-ción no estricta en los lenguajes funcionales es la de re-ducción mediante un grafo. La evaluación no estricta es

utilizada por defecto en multitud de lenguajes funciona-les puros, incluidos Miranda, Clean y Haskell.Hughes (1984) defendía la evaluación no estricta comoun mecanismo para mejorar la modularidad de los pro-gramas a través de la separación de tareas, a partir de laimplementación de productores y consumidores de flu-jos de datos de forma fácil e independiente. Launchbury(1993) describe algunas dificultades que tenía la evalua-ción no estricta, particularmente al analizar los requisitosde almacenamiento de los programas, y propone una se-mántica operacional para ayudar durante el análisis. Har-per (2009) propone incluir ambas técnicas (evaluaciónestricta y no estricta) en el mismo lenguaje, utilizandolos tipos del sistema del lenguaje para distinguirlas.

2.5 Tipo de sistemas

Especialmente desde el desarrollo de tipos de inferenciade Hindley - Milner en la década de 1970, los lengua-jes de programación funcionales han tendido a utilizar elcálculo con tipo lambda, en comparación con el cálculolambda sin tipo utilizado en Lisp y sus variantes (talescomo el lenguaje scheme). El uso de tipos de datos alge-braicos y la coincidencia de patrones hace que la mani-pulación de estructuras de datos complejas convenientesy expresivos, la presencia de comprobaciones estrictas detipos en tiempo de compilación hace que los programassean más fiable, mientras que la inferencia de tipos liberaal programador de la necesidad de declarar manualmentelos tipos para el compilador.Algunos lenguajes funcionales orientados a la investiga-ción, tales como Coq, Agda, Cayenne y Epigram se basanen la teoría de tipo intuicionista, que permite a los tiposa depender de los términos. Estos tipos se denominan ti-pos dependientes. Estos sistemas de tipo no tienen un tipodecidible inferencia y son difíciles de entender y progra-mar con plantillas de citación. Pero tipos dependientespueden expresar proposiciones arbitrarias en la lógica depredicados.A través del isomorfismo de Curry-Howard, entonces,mecanografiados a programas en estas lenguas se con-vierten en una forma de escribir las pruebas matemáticasformales de las que un compilador puede generar códigode certificado. Si bien estas lenguas son principalmentede interés en la investigación académica (incluyendo lasmatemáticas formalizadas), han comenzado a ser utiliza-do en la ingeniería también. Compcert es un compiladorpara un subconjunto del lenguaje de programación C quese escribe en Coq y verificó formalmente. Una forma li-mitada de tipos dependientes llamados tipos de datos al-gebraicos generalizados (GADTs) puede ser implemen-tado de una manera que ofrece algunos de los beneficiosde la programación dependiente escrito, evitando la ma-yor parte de su inconveniencia. GADTs están disponiblesen el GlasgowHaskell Compiler, en OCaml (desde la ver-sión 4.00) y en Scala y se han propuesto como adiciones

Page 4: Programación Funcional

4 3 VENTAJAS DE USAR UN PARADIGMA FUNCIONAL

a otros idiomas, incluyendo Java y C#.

2.6 La programación funcional en lengua-jes no funcionales

Es posible utilizar un estilo de programación funcionalen lenguajes que tradicionalmente no se consideran len-guajes funcionales. Por ejemplo, tanto D y Fortran95 seapoyan explícitamente en funciones puras. Funciones deprimera clase, se han añadido lentamente a los lenguajesprincipales. Por ejemplo, a principios de 1994, el apoyoa lambda, filtro, mapa, y reducir esta en Python. Luego,durante el desarrollo de Python 3000, Guido van Rossumpidió la eliminación de estas características. Sin embar-go, más tarde cambió de opinión, y sólo la reducción fueeliminado, a pesar de que sigue siendo accesible a travésde los módulos de biblioteca functools estándar. Funcio-nes de primera clase también fueron introducidas en PHP5.3, Visual Basic9, C#3.0 y C++11.En Java, las clases anónimas a veces pueden ser utilizadospara simular clausuras. Sin embargo, las clases anónimasno son siempre los reemplazos completos de las clausu-ras, ya que tienen capacidades más limitadas. Por ejem-plo, Java 8, incluye expresiones lambda para reemplazardeterminadas clases anónimas. Sin embargo, la presen-cia de excepciones con comprobaciones en este lenguajepuede desaconsejar el uso de programación funcional, yaque puede ser necesario para capturar las excepciones quese deben controlar para después volverlas a lanzar ellos(problema este que sin embargo no se produce en otroslenguajes sobre JVM que no tienen excepciones compro-badas, como es Scala).Muchos patrones de diseño orientado a objetos se pue-den expresar en términos de programación funcional porejemplo : el patrón de estrategia simplemente dicta el usode una función de orden superior, y el patrón de visitan-tes corresponde aproximadamente a un catamorfismo, odoble también conocido como reducir, comprimir, o in-yectar, se refiere a una familia de funciones de orden su-perior que analiza una estructura de datos recursiva y serecombinan con el uso de una operación de combinación.Del mismo modo, la idea de los datos inmutables de laprogramación funcional se incluye a menudo en lengua-jes de programación imperativa, por ejemplo, la tupla dePython, que es una matriz inmutable.

3 Ventajas de usar un paradigmafuncional

Entre las ventajas que suelen citarse de usar un paradigmafuncional en la programación de computadoras, están lassiguientes:[1]

• Ausencia de efectos colaterales

• Proceso de depuración menos problemático• Pruebas de unidades más confiables• Mayor facilidad para la ejecución concurrente

3.1 Simulación de estados

Hay tareas (como por ejemplo, el mantenimiento del sal-do de una cuenta bancaria) que a menudo parecen imple-mentadas con estados. La programación funcional puraactúa sobre esas tareas, tareas de entrada/salida de datostales como entrada de datos por parte del usuario y mos-trar resultados por pantalla, de una forma diferente.El lenguaje de programación funcional Haskell lo imple-menta usando mónadas, estructura que representa cálcu-los que se describen como una secuencia de pasos, deri-vada de la teoría de categorías.Las mónadas ofrecen una forma de abstraer ciertos tiposde patrones computacionales, incluyendo (pero no limi-tado a) el diseño de operaciones con estados cambiantes(y otras acciones secundarias tales como entrada/salidade datos) de una manera imperativa sin perder la pure-za. Mientras las mónadas existentes pueden ser fáciles deaplicar en un programa usando las plantillas y ejemplosadecuados, muchos estudiantes tienen problemas para en-tenderlo conceptualmente, por ejemplo cuando se les pidedefinir nuevas mónadas. (lo que a veces resulta necesariopara ciertos tipos de librerías)[2]

Otra forma en la que los lenguajes funcionales pueden si-mular estados es rodeando una estructura de datos querepresenta el estado actual como un parámetro para lla-madas a funciones. En cada llamada a función, se crea unacopia de esta estructura de datos que se diferencia con elresultado de la función. Esto se conoce como “estilo depaso de estado”.Los lenguajes funcionales no puros normalmente inclu-yen métodos para gestionar el cambio de estado más di-rectamente. Clojure por ejemplo, usa una gestión de refe-rencias que pueden ser actualizadas aplicando funcionespuras al estado actual. Este tipo de enfoque permite elcambio de estado, promoviendo el uso de funciones pu-ras como la mejor forma de realizar cálculos.Métodos alternativos como Hoare logic, el cual es un sis-tema formal con un conjunto de reglas lógicas que sirvenpara razonar con rigor acerca de la corrección de progra-mas, y la singularidad han sido desarrollados para realizarun seguimiento de los efectos secundarios en los progra-mas. Algunos lenguajes de investigación modernos usansistemas de efectos para hacer explícita la presencia deefectos colaterales.

3.2 Cuestiones de eficiencia

Los lenguajes de programación son típicamente menoseficientes en el uso de CPU y memoria que los lenguajes

Page 5: Programación Funcional

4.1 Estilos de codificación 5

imperativos como pueden ser C y Pascal. Esto está rela-cionado con el hecho de que algunas estructuras de datosde tamaño indefinido como los vectores tienen una pro-gramación muy sencilla usando el hardware existente, elcual es una máquina de Turing bastante evolucionada. Sepuede acceder muy eficientemente a las posiciones delarray con CPUs con un alto grado de perfeccionamien-to, haciendo pre búsquedas eficientemente a través de lasmemorias caché o manejado con instrucciones SIMD. Yno es fácil crear componentes homólogos inmutables depropósito general con la misma eficiencia. Para lengua-jes puramente funcionales, el peor caso descendente esel logarítmico en el número de celdas de memoria usa-das, porque las estructuras de memoria que cambian detamaño pueden ser representadas por estructuras de da-tos puramente funcionales con tiempo de acceso logarít-mico, como por ejemplo un árbol equilibrado. Sin em-bargo, tales retrasos no son universales. Para programasque realizan cálculos numéricos intensivos, los lenguajesfuncionales tales como OCaml y Clean son algo más len-tos que C. Para programas que manejan grandes matricesy bases de datos multidimensionales, los vectores de loslenguajes funcionales, como J y K, fueron diseñados op-timizando su velocidad.La inalterabilidad de los datos puede llevar en muchoscasos a ejecuciones eficientes permitiendo al compiladorhacer suposiciones que en un lenguaje imperativo resul-tarían arriesgadas, aumentando las probabilidades para laexpansión en línea, que es una optimización del compila-dor que sustituye en el lugar de la llamada a una funcióncon el cuerpo del destinatario de la llamada mejorando eluso del tiempo y espacio en tiempo de ejecución.La evaluación perezosa es una estrategia de evaluaciónque retrasa el cálculo de una expresión hasta que su va-lor sea necesario, también puede mejorar la velocidad delproblema, incluso asintóticamente, mientras que puedereducir la velocidad por un factor constante, sin embargopuede producir pérdidas de memoria si se usa de maneraincorrecta. Launchbury 1993 discute de manera teóricalos problemas relacionados con las pérdidas de memo-ria de evaluación perezosa, y O’Sullivan et al. 2008 daalgunos consejos prácticos para el análisis y la soluciónde estos problemas. Sin embargo, las implementacionesmás generales de evaluación perezosa hace un uso exten-sivo de código sin referencia y los datos llevan a cabo unfuncionamiento pobre en los procesadores modernos conun alto grado de paralelismo y cachés multinivel, dondeun fallo de caché puede producir un coste de cientos deciclos de reloj.

4 Lenguajes funcionales

Entre los lenguajes funcionales puros, cabe destacar aHaskell y Miranda. Los lenguajes funcionales híbridosmás conocidos son Scala, Lisp, Clojure, Scheme, Ocaml,SAP y Standard ML (estos dos últimos, descendientes

del lenguaje ML). Erlang es otro lenguaje funcional deprogramación concurrente. Mathematica permite la pro-gramación en múltiples estilos, pero promueve la progra-mación funcional. R también es un lenguaje funcional de-dicado a la estadística.[3] Recientemente Microsoft Re-search está trabajando en el lenguaje F# (Functional#).Entre otros lenguajes que se podrían utilizar para progra-mación funcional se podrían incluir a Perl, pues, aunquees un lenguaje de propósito muy general, se pueden rea-lizar programas usando exclusivamente funciones defini-das por el usuario; así como Python, como lenguaje queincorpora el paradigma funcional; o Ruby.

4.1 Estilos de codificación

Mientras que los programas imperativos tienden a pro-porcionar los pasos a dar por un programa, los funciona-les tienden a enfatizar la composición y disposición de lasfunciones, sin especificar pasos de manera explícita.

5 Uso en la industria

La programación funcional es más popular en el ámbitoacadémico que en ámbitos industriales. Sin embargo seha empezado a usar importantes lenguajes de programa-ción funcionales en sistemas comerciales o industriales.Un ejemplo de lenguaje de programación usado en el ám-bito industrial es el Erlang, el cual fue desarrollado paraponer en práctica el sistema de tolerancia a fallos en lastelecomunicaciones. Importantes empresas como What-sApp, Facebook, o T-Mobile optaron por Erlang comolenguaje en alguno de sus desarrollos. Otro ejemplo deuso de los lenguajes de programación funcionales en laindustria es el caso del uso del Scheme de Lisp, que fueusado como base en el desarrollo de aplicaciones para losprimeros ordenadores de la firma Apple Macintosh. Dehecho, hoy en día,está siendo usado para desarrollo de sis-temas de simulación y de control de telescopio. Haskell,es un ejemplo de lenguaje que creó con propósito de len-guaje de investigación pero que se ha usado para el desa-rrollo de sistemas aeroespaciales, programación web y di-seño hardware. Otros lenguajes de programación funcio-nales han sido usados en ámbitos comerciales y financie-ros.

6 Véase también

• Lenguaje de programación

• Cálculo Lambda

• Teoría de categorías

Page 6: Programación Funcional

6 7 REFERENCIAS

7 Referencias[1] http://ademirar.wordpress.com/2010/08/28/

programacion-funcional-para-el-resto-de-nosotros/

[2] Newbern, J. «All About Monads: A comprehensive gui-de to the theory and practice of monadic programming inHaskell». Consultado el 14 de febrero de 2008.

[3] Barrapunto | Programación funcional para el resto de no-sotros

Page 7: Programación Funcional

7

8 Text and image sources, contributors, and licenses

8.1 Text• Programación funcional Fuente: http://es.wikipedia.org/wiki/Programaci%C3%B3n%20funcional?oldid=78655498 Colaboradores:

Robbot, Ricpelo, Miuler, Ascánder, Rsg, Elwikipedista, Endo, Rutrus, Yurik, Yrithinnd, Orgullobot, RobotQuistnix, Yrbot, Cesarsorm,BOTijo, YurikBot, GermanX, Eskimbot, Maldoror, Tute, JoaquinFerrero, JAnDbot, TXiKiBoT, HiTe, Sirpuppet, Cinevoro, VolkovBot,Technopat, Gdelfino, Aliamondano, David.Villa, Luis1970, Muro Bot, Edmenb, El Pantera, Mrubio166, YonaBot, SieBot, Danielba894,Luis ademir, BOTarate, BuenaGente, Nicop, DragonBot, Eduardosalg, Edgarchan, Osado, AVBOT, MastiBot, Diegusjaimes, DumZiBoT,MelancholieBot, Luckas-bot, Ptbotgourou, Xqbot, Jkbw, FrescoBot, Surfaz, Botarel, Skaponcio, Panderine!, Dinamik-bot, EmausBot, Gri-llitus, ChuispastonBot, Gusama Romero, Syrusakbary, Elvisor, Flashlack, Leitoxx, Addbot, BOTito, Jacalco y Anónimos: 61

8.2 Images• Archivo:Commons-emblem-question_book_orange.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/1/1f/

Commons-emblem-question_book_orange.svg Licencia: CC BY-SA 3.0 Colaboradores: <a href='//commons.wikimedia.org/wiki/File:Commons-emblem-issue.svg' class='image'><img alt='Commons-emblem-issue.svg' src='//upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/25px-Commons-emblem-issue.svg.png' width='25' height='25'srcset='//upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/38px-Commons-emblem-issue.svg.png1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/50px-Commons-emblem-issue.svg.png 2x'data-file-width='48' data-file-height='48' /></a> + <a href='//commons.wikimedia.org/wiki/File:Question_book.svg' class='image'><imgalt='Question book.svg' src='//upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/25px-Question_book.svg.png'width='25' height='20' srcset='//upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/38px-Question_book.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/50px-Question_book.svg.png 2x' data-file-width='252' data-file-height='199' /></a> Artista original: GNOME icon artists, Jorge 2701

• Archivo:Subprograma.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/9/98/Subprograma.svg Licencia: GFDL Colabora-dores: Trabajo propio Artista original: Josell7

8.3 Content license• Creative Commons Attribution-Share Alike 3.0