Beruflich Dokumente
Kultur Dokumente
Entrada
Parmetros
Proceso
Subrutina
o funcin
Salida
te los que son puramente funcionales, han sido enfatizados en el ambiente acadmico principalmente y no tanto
en el desarrollo de software comercial. Sin embargo, lenguajes de programacin importantes tales como Scheme,
Erlang, Rust, Objective Caml 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 especco como R (estadstica), Mathematica (matemticas simblicas), J y K (anlisis nanciero), F# en Microsoft.NET y XSLT (XML). Lenguajes de uso especco 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.
Valor de
retorno
La programacin funcional tambin puede ser desarrollada en lenguajes que no estn diseados especcamente
para la programacin funcional. En el caso de Perl, por
ejemplo, que es un lenguaje de programacin imperativo,
existe un libro que describe como 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, esta incorporando la programacin funcional, as como el uso de las expresiones lambda.
1 Utilidad
El objetivo es conseguir lenguajes expresivos y matemticamente elegantes, en los que no sea necesario bajar al
nivel de la mquina para describir el proceso llevado a
cabo por el programa, y evitar el concepto de estado del
cmputo. La secuencia de computaciones llevadas a cabo por el programa se rige nica y exclusivamente por la
reescritura de deniciones ms amplias a otras cada vez
ms concretas y denidas, usando lo que se denominan
deniciones dirigidas.
2 Caractersticas
lenguaje imperativo, sino como funciones puramente matemticas, en las que se verican ciertas propiedades como la transparencia referencial (el signicado de una expresin depende nicamente del signicado de sus subexpresiones), y por tanto, la carencia total de efectos colaterales.
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 imperativos, 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.
2.1
CARACTERSTICAS
2.3 Recursividad
Iterar en los lenguajes funcionales es normalmente llevado a cabo mediante recursividad. Las funciones recursivas se invocan a s mismas, permitiendo que una operacin se realice una y otra vez hasta alcanzar el caso
base. Aunque algunas recursividades requieren el mantenimiento de una pila, la recursividad mediante una cola
puede ser reconocida y optimizada mediante un compilador dentro del mismo cdigo utilizado, para implementar las iteraciones en un lenguaje imperativo. El estndar
del esquema del lenguaje requiere implementaciones para conocer y optimizar la recursividad mediante una cola. La optimizacin de la recursividad mediante una cola
2.5
Tipo de sistemas
puede ser implementada transformando el programa a un utilizada por defecto en multitud de lenguajes funcionaestilo de pase de continuidad durante la compilacin, en- les puros, incluidos Miranda, Clean y Haskell.
tre otros enfoques.
Hughes (1984) defenda la evaluacin no estricta como
Los patrones comunes de recursividad puede ser factori- un mecanismo para mejorar la modularidad de los prozados usando funciones comunes ms grandes, con ca- gramas a travs de la separacin de tareas, a partir de la
tamorsmos y anamorsmos (pliegues y despliegues), implementacin de productores y consumidores de usiendo estos los ejemplos ms evidentes. Tal y como las jos de datos de forma fcil e independiente. Launchbury
mayores funciones ms comunes tienen un rol anlogo (1993) describe algunas dicultades que tena la evaluapara construir estructuras de control se tienen los itera- cin no estricta, particularmente al analizar los requisitos
dores en los lenguajes imperativos.
de almacenamiento de los programas, y propone una seLa mayora de los lenguajes de programacin funcional mntica operacional para ayudar durante el anlisis. Harde propsito general permiten la recursividad sin restric- per (2009) propone incluir ambas tcnicas (evaluacin
ciones y superan el test de Turing, lo que hace que el pro- estricta y no estricta) en el mismo lenguaje, utilizando
grama que se interrumpe no pueda tomar un decisin, lo los tipos del sistema del lenguaje para distinguirlas.
que puede causar una falta de solidez en el razonamiento ecuacional y generalmente requiere introducir inconsistencia dentro de la lgica expresada por los tipos del
sistema del lenguaje. Algunos lenguajes de propsito especial como Coq permiten tan slo recursividad bien fundamentada y tienen una normalizacin fuerte(clculos no
nalizados pueden ser expresados tan slo con ujos de
valores innitos llamados codata) En consecuencia, estos lenguajes fallan el test de Turing y declarar funciones
ciertas en ellos es imposible, pero pueden declarar una
amplia clase de clculos interesantes mientras evitan los
problemas producidos por la recursividad sin restricciones. La programacin funcional limitada a la recursividad
bien construida con unas cuantas restricciones ms se llama programacin funcional total.
2.4
2.6
Cuestiones de eciencia
4.1
Estilos de codicacin
imperativos como pueden ser C y Pascal. Esto est relacionado con el hecho de que algunas estructuras de datos
de tamao indenido como los vectores tienen una programacin muy sencilla usando el hardware existente, el
cual es una mquina de Turing bastante evolucionada. Se
puede acceder muy ecientemente a las posiciones del
array con CPUs con un alto grado de perfeccionamiento, haciendo pre bsquedas ecientemente a travs de las
memorias cach o manejado con instrucciones SIMD. Y
no es fcil crear componentes homlogos inmutables de
propsito general con la misma eciencia. Para lenguajes puramente funcionales, el peor caso descendente es
el logartmico en el nmero de celdas de memoria usadas, porque las estructuras de memoria que cambian de
tamao pueden ser representadas por estructuras de datos puramente funcionales con tiempo de acceso logartmico, como por ejemplo un rbol equilibrado. Sin embargo, tales retrasos no son universales. Para programas
que realizan clculos numricos intensivos, los lenguajes
funcionales tales como OCaml y Clean son algo ms lentos que C. Para programas que manejan grandes matrices
y bases de datos multidimensionales, los vectores de los
lenguajes funcionales, como J y K, fueron diseados optimizando su velocidad.
La inalterabilidad de los datos puede llevar en muchos
casos a ejecuciones ecientes permitiendo al compilador
hacer suposiciones que en un lenguaje imperativo resultaran arriesgadas, aumentando las probabilidades para la
expansin en lnea, que es una optimizacin del compilador que sustituye en el lugar de la llamada a una funcin
con el cuerpo del destinatario de la llamada mejorando el
uso del tiempo y espacio en tiempo de ejecucin.
La evaluacin perezosa es una estrategia de evaluacin
que retrasa el clculo de una expresin hasta que su valor sea necesario, tambin puede mejorar la velocidad del
problema, incluso asintticamente, mientras que puede
reducir la velocidad por un factor constante, sin embargo
puede producir prdidas de memoria si se usa de manera
incorrecta. Launchbury 1993 discute de manera terica
los problemas relacionados con las prdidas de memoria de evaluacin perezosa, y OSullivan et al. 2008 da
algunos consejos prcticos para el anlisis y la solucin
de estos problemas. Sin embargo, las implementaciones
ms generales de evaluacin perezosa hace un uso extensivo de cdigo sin referencia y los datos llevan a cabo un
funcionamiento pobre en los procesadores modernos con
un alto grado de paralelismo y cachs multinivel, donde
un fallo de cach puede producir un coste de cientos de
ciclos de reloj.
5
del lenguaje ML). Erlang es otro lenguaje funcional de
programacin concurrente. Mathematica permite la programacin en mltiples estilos, pero promueve la programacin funcional. R tambin es un lenguaje funcional dedicado a la estadstica.[3] Recientemente Microsoft Research est trabajando en el lenguaje F# (Functional#).
Entre otros lenguajes que se podran utilizar para programacin funcional se podran incluir a Perl, pues, aunque
es un lenguaje de propsito muy general, se pueden realizar programas usando exclusivamente funciones denidas por el usuario; as como Python, como lenguaje que
incorpora el paradigma funcional; o Ruby.
5 Uso en la industria
La programacin funcional es ms popular en el mbito
acadmico que en mbitos industriales. Sin embargo se
ha empezado a usar importantes lenguajes de programacin funcionales en sistemas comerciales o industriales.
Un ejemplo de lenguaje de programacin usado en el mbito industrial es el Erlang, el cual fue desarrollado para
poner en prctica el sistema de tolerancia a fallos en las
telecomunicaciones. Importantes empresas como WhatsApp, Facebook, o T-Mobile optaron por Erlang como
lenguaje en alguno de sus desarrollos. Otro ejemplo de
uso de los lenguajes de programacin funcionales en la
industria es el caso del uso del Scheme de Lisp, que fue
usado como base en el desarrollo de aplicaciones para los
primeros ordenadores de la rma Apple Macintosh. De
hecho, hoy en da,est siendo usado para desarrollo de sistemas de simulacin y de control de telescopio. Haskell,
es un ejemplo de lenguaje que cre con propsito de lenguaje de investigacin pero que se ha usado para el desarrollo de sistemas aeroespaciales, programacin web y diseo hardware. Otros lenguajes de programacin funcionales han sido usados en mbitos comerciales y nancieros.
6 Vase tambin
4
Lenguajes funcionales
Lenguaje de programacin
Clculo Lambda
Teora de categoras
Referencias
[1] http://ademirar.wordpress.com/2010/08/28/
programacion-funcional-para-el-resto-de-nosotros/
[2] Newbern, J. All About Monads: A comprehensive guide to the theory and practice of monadic programming in
Haskell. Consultado el 14 de febrero de 2008.
[3] Barrapunto | Programacin funcional para el resto de nosotros
REFERENCIAS
8.1
Text
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.png
1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/50px-Commons-emblem-issue.svg.png 2x'
data-le-width='48' data-le-height='48' /></a> + <a href='//commons.wikimedia.org/wiki/File:Question_book.svg' class='image'><img
alt='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-lewidth='252' data-le-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 Colaboradores: Trabajo propio Artista original: Josell7
8.3
Content license