Top 10 de los artículos

YouTube
Gmail
Goole
GayRomeo
Números chinos
Números romanos
Orkut
Costco
Sistema porta hepático
El mundo Factbook

News:

Programación funcional

En informática, programación funcional es a paradigma de programación ese convites cómputo como la evaluación de funciones matemáticas y evita estado y mutable datos. Acentúa el uso de funciones, al contrario de programación imprescindible labre que acentúa cambios en estado.[1]

cálculo de la lambda proporciona el modelo para la programación funcional. Las idiomas funcionales modernas se pueden ver como adornos al cálculo de la lambda.[1]

Mientras que no completamente es funcional, amba la original Lisp y APL eran importante en el desarrollo de la programación funcional. Versiones más últimas del lisp por ejemplo Esquema y las variantes del APL proporcionaron la ayuda funcional completa. Otras idiomas funcionales importantes incluyen Erlang, Haskell, y Ml.

Funcional programación idiomas, especialmente puramente funcional unos, se han acentuado en gran parte adentro academia más bien que en el desarrollo comercial del software. Sin embargo, los lenguajes de programación funcionales notables usados en industria y los usos comerciales incluyen Erlang (usos concurrentes),[2] R (estadística),[3] Mathematica (matemáticas simbólica),[4] Ml,[5] J y K (análisis financiero), y lenguajes de programación dominio-específicos como XSLT.[6][7]

Contenido

Historia

Cálculo de la lambda proporciona un marco teórico para describir funciones y su evaluación. Aunque es una abstracción matemática más bien que un lenguaje de programación, forma la base de casi todos los lenguajes de programación funcionales hoy.

Lógica combinatoria es una fundación teórica equivalente, desarrollada cerca Moses Schönfinkel y Curry de Haskell. Fue desarrollado originalmente para alcanzar un acercamiento más claro a las fundaciones de las matemáticas.[8] La lógica combinatoria se percibe comúnmente como más abstracta que cálculo de la lambda y precedido le en la invención.

Una lengua funcional-condimentada temprana era Lisp, convertido cerca Juan McCarthy mientras que en MIT para IBM 700/7000 serie computadoras científicas en los últimos años 50.[9] El lisp introdujo muchas características ahora encontradas en idiomas funcionales, aunque el lisp es técnico una lengua del multi-paradigma. Esquema y Dylan eran tentativas más últimas de simplificar y de mejorar el lisp.

Lengua de la tratamiento de la información (IPL) se cita a veces como el primer lenguaje de programación funcional computarizado. Es una lengua del montaje-estilo para las listas de manipulación de símbolos. Tiene una noción del “generador”, que asciende a una función que acepta una función como discusión, y, puesto que es una lengua del montaje-nivel, el código se puede utilizar como datos, así que el IPL se puede mirar como teniendo funciones higher-order. Sin embargo, confía pesadamente en la estructura mutating de la lista y características imprescindible similares.

Kenneth E. Iverson desarrolló Lenguaje de programación del APL en los años 60 tempranos, descritos en su libro 1962 Un lenguaje de programación (ISBN 9780471430148). El APL era la influencia primaria encendido Juan Backus's Lenguaje de programación del punto de congelación. En los años 90 tempranos, Iverson y Roger Hui creó un sucesor al APL, Lenguaje de programación de J. En los años 90 mediados de, Arturo Whitney, que había trabajado previamente con Iverson, creó Lenguaje de programación de K, que se utiliza comercialmente en industrias financieras.

Juan Backus presentó Lenguaje de programación del punto de congelación en su 1977 Concesión de Turing conferencia ¿Se puede la programación liberar del von Neumann Style? Un estilo funcional y su álgebra de programas. Él define los programas funcionales como siendo acumulado de una manera jerárquica por medio de “combinar forma” que permiten una “álgebra de programas”; en lengua moderna, esto significa que los programas funcionales siguen principio de la composicionalidad. El papel de Backus popularizó la investigación en la programación funcional, aunque acentuó programación del función-nivel más bien que el estilo del lambda-cálculo que ha venido ser asociado a la programación funcional.

En los años 70 Lenguaje de programación del ml fue creado cerca Robin Milner en Universidad de Edimburgo, y David Turner desarrolló la lengua Miranda en Universidad de Kent. El ml se convirtió eventual en varios dialectos, el campo común de que ahora está más Caml objetivo y Ml estándar. Lenguaje de programación de Haskell fue lanzado a el final de los '80 en un intento por recolectar juntas muchas ideas en la investigación de la programación funcional.

Conceptos

Un número de conceptos y de paradigmas son específicos a la programación funcional, y generalmente extranjeros a programación imprescindible (incluyendo programación orientada al objeto). Sin embargo, los lenguajes de programación son a menudo híbridos de varios paradigmas de programación así que los programadores que usan “sobre todo” idiomas imprescindible pudieron haber utilizado algunos de estos conceptos.[10]

Funciones Higher-order

Las funciones son higher-order cuando pueden tomar otras funciones como discusiones, y las vuelven como resultados. ( derivado y antiderivative en cálculo son los ejemplos de esto.)

Las funciones Higher-order se relacionan de cerca con funciones de primera clase, en ésa las funciones higher-order y las funciones de primera clase ambas permiten funciones como discusiones y resultados de otras funciones. La distinción entre los dos es sutil: “higher-order” describe un concepto matemático de las funciones que funcionan encendido otras funciones, mientras que “de primera clase” es un término de la informática que describe las entidades del lenguaje de programación que no tienen ninguna restricción en su uso (así las funciones de primera clase pueden aparecer dondequiera en el programa que otras entidades de primera clase como la poder de los números, incluyendo como discusiones a otras funciones y como sus valores de vuelta).

Las funciones Higher-order permiten el currying, una técnica en la cual una función se aplica a sus discusiones una a la vez, con cada uso volviendo una nueva función (higher-order) que acepta la discusión siguiente.

Funciones puras

Puramente funcional los programas tienen no efectos secundarios. Esto hace más fácil razonar sobre su comportamiento. Sin embargo, casi ningunos programadores incomodan escribir programas puramente funcionales, puesto que, por la definición, un programa sin efectos secundarios (uno que no acepta ninguna entrada, no produce ninguna salida, e interfaces sin los dispositivos externos) es formalmente equivalente a un programa que no haga nada; típicamente, la pureza se utiliza para hacer cumplir a separación de preocupaciones donde una sección claro-delineada del programa hace operaciones impuras como la entrada-salida, y llama funciones puras y bibliotecas según lo necesitado computar respuestas.

Por ejemplo, el resultado de aplicar una función pura a las discusiones puras no depende de la orden de la evaluación. Consecuentemente, una lengua que no tiene ninguna función impura (“una lengua puramente funcional,” por ejemplo Haskell) puede utilizar llamar-por-necesite la evaluación. Sin embargo, no todas las idiomas funcionales son puras. La familia del lisp de idiomas no es pura porque permiten efectos secundarios.

Puesto que las funciones puras no modifican variables compartidas, las funciones puras se pueden ejecutar en paralelo sin interferir el uno con el otro. Las funciones puras están por lo tanto roscar-seguro, que permiten que los intérpretes y los recopiladores utilicen evaluación del llamar-por-futuro.

Los lenguajes de programación funcionales puros hacen cumplir típicamente transparencia de referencia, que es la noción que “iguala se puede substituir para los iguales”: si dos expresiones tienen valores del “igual” (para una cierta noción de la igualdad), entonces una se puede substituir para la otra en cualquier expresión más grande sin afectar el resultado del cómputo. Por ejemplo, adentro

y = f(x) * f(x);

un factor de la poder del recopilador hacia fuera f (x) si es puro, transformando el programa a

z = f(x);
y = z * z;

y eliminando la segunda evaluación (posiblemente) de la llamada costosa a f (x). Se llama esta optimización eliminación común del subexpression.

Sin embargo, si una función tiene efectos secundarios, la llamada de función no puede ser eliminada. Considere el fragmento siguiente del programa:

y = al azar() * al azar();

La segunda llamada a al azar no puede ser eliminado, porque su valor de vuelta puede ser diferente de el de la primera llamada. Semejantemente,

y = printf(“x”) * printf(“x”);

no puede ser optimizado lejos; aunque printf vuelve el mismo valor ambas veces; el no poder hacer la segunda llamada daría lugar a diversa salida del programa.

Mientras que la mayoría de los recopiladores para los lenguajes de programación imprescindible detectaron funciones puras, y realizan la eliminación común del subexpression para las llamadas de función puras, las bibliotecas pre-compiladas no exponen generalmente esta información, previniendo llaman a las funciones externas de la optimización lejos. Algunos recopiladores, por ejemplo GCC, agregue las palabras claves adicionales para un programador a explícitamente marcan funciones externas como puro para poder realizarse esta optimización en presencia de precompiled bibliotecas. FORTRAN 95 permite que las funciones sin efectos secundarios sean señaladas “puro”.

Repetición

Artículo principal: Repetición (informática)

Iteración (colocación) en idiomas funcionales se logra generalmente vía repetición. Funciones recurrentes invoqúese, permitiendo que una operación sea realizada repetidamente. La repetición puede requerir mantener un apilado, pero repetición de la cola puede ser reconocido y ser optimizado por un recopilador en el mismo código usado para poner la iteración en ejecución en idiomas imprescindible. Lenguaje de programación del esquema el estándar requiere puestas en práctica reconocer y optimizar la repetición de la cola.

Los patrones comunes de la repetición se pueden descomponer en factores hacia fuera usando funciones de una orden más alta, catamorphisms y anamorphisms (o los “dobleces” y “revelan”) siendo los ejemplos más obvios. Tal orden más alta funciona juego que un papel análogo al control incorporado estructura por ejemplo lazos en idiomas imprescindible.

Evaluación terminante, no-terminante y perezosa

Las idiomas funcionales se pueden categorizar cerca si utilizan la evaluación terminante o no-terminante, los conceptos que se refieren a cómo se procesan las discusiones de la función cuando se está evaluando una expresión. Para ilustrar, considere las dos funciones siguientes f y g:

f (x): = x^2+x+1
 g (x, y): = x+y

La expresión siguiente se puede evaluar en una de dos maneras.

f (g (1, 4))

Evalúe la función íntima g primero:

f (g (1, 4))   →   f (1+4)   →   f (5)   →   5^2+5+1   →   31

O evalúe la función exterior f primero:

f (g (1, 4))   →   g (1.4) ^2+g (1.4) +1   →   (1+4) ^2+ (1+4) +1   →   5^2+5+1   →   31

El primer caso es un caso de la evaluación terminante: las discusiones a una función se evalúan antes de la llamada de función; mientras que el segundo caso es un caso de la evaluación no-terminante donde las discusiones se pasan a la función unevaluated y la función que llama se determina cuando las discusiones deben ser evaluadas.

La evaluación terminante tiene ventajas de la eficacia. Una discusión se evalúa una vez con la evaluación terminante, mientras que puede ser evaluada las épocas múltiples con la evaluación no-terminante, como se puede considerar en el ejemplo antedicho donde g (1.4) se evalúa dos veces. También, la evaluación terminante es más fácil de poner en ejecución puesto que las discusiones pasadas a una función son valores de los datos, mientras que con la evaluación no-terminante las discusiones pueden ser expresiones, requiriendo una cierta noción de encierro. Por estas razones, las idiomas funcionales más tempranas, tales como lisp, ISWIM y ml utilizan la evaluación terminante.

Al menos hay razones de preferir la evaluación no-terminante. El cálculo de la lambda proporciona una fundación teórica más fuerte para las idiomas que emplean la evaluación no-terminante.[1] También la evaluación no-terminante preve una lengua más expresiva. Por ejemplo, apoya las estructuras de datos infinitas, tales como una lista de todos los números primeros (tales estructuras están de uso cuando una parte indefinida pero finita de la estructura se requiere).

La necesidad de una forma más eficiente de evaluación no-terminante condujo al desarrollo de evaluación perezosa, un tipo de evaluación no-terminante, donde la evaluación inicial de una discusión se comparte a través de la secuencia de la evaluación. Por lo tanto una discusión (tal como g (1.4) en el ejemplo antedicho) nunca se evalúa más de una vez. La evaluación perezosa tiende para ser utilizada por idiomas funcionales puras por ejemplo Miranda, Limpio y Haskell; sin embargo muchas otras idiomas funcionales más recientes continúan utilizando la evaluación terminante.[la citación necesitó]

Programación funcional en idiomas no funcionales

Es posible emplear un estilo funcional de la programación en las idiomas que tradicionalmente no se consideran las idiomas funcionales.[11] Algunas idiomas no funcionales han pedido prestadas características por ejemplo funciones higher-order, y comprensiones de la lista de lenguajes de programación funcionales. Esto hace más fácil adoptar un estilo funcional al usar estas idiomas. Las construcciones funcionales tales como funciones higher-order y listas perezosas se pueden obtener en C++ vía bibliotecas.[12] En C una puede utilizar indicadores de la función para conseguir algunos de los efectos de funciones higher-order, por ejemplo una puede poner la función en ejecución común mapa usar indicadores de la función. Las idiomas específicas del dominio declarativo extenso tienen gusto SQL y Lex/Yacc, mientras que no siempre Turing-completo, utilice algunos elementos de la programación funcional, especialmente en la abstención de valores mutable.[13]

Comparación de la programación funcional e imprescindible

La programación funcional es muy diferente de programación imprescindible. Las diferencias más significativas provienen el hecho que la programación funcional evita efectos secundarios, que se utilizan en la programación imprescindible para poner el estado y la entrada-salida en ejecución. Programación funcional pura rechaza efectos secundarios totalmente. El rechazo de efectos secundarios preve transparencia de referencia, que hace más fácil verificar, optimizar, y hacer parelelismo programas, y más fácil escribir automatizó las herramientas para realizar esas tareas.

Las funciones de una orden más alta se utilizan raramente en una más vieja programación imprescindible. Donde un programa imprescindible tradicional pudo utilizar un lazo para atravesar una lista, un estilo funcional utilizaría a menudo una función higher-order, el mapa, que toma como discusiones una función y una lista, aplica la función a cada elemento de la lista, y vuelve una lista de los resultados.

Simulación del estado

Hay tarea-para el ejemplo, manteniendo un balance- that de la cuenta bancaria se parece a menudo puesto en ejecución lo más naturalmente posible con el estado. La programación funcional pura realiza estas tareas, y tareas de la entrada-salida tales como aceptar al usuario entrado e impresión a la pantalla, de una diversa manera.

El lenguaje de programación funcional puro Haskell los pone en ejecución que usan mónadas, derivado de teoría de la categoría. Los mónadas son de gran alcance y ofrecen una manera intuitiva de modelar el estado (y otros efectos secundarios tales como IO) de una manera imprescindible sin pureza perdidosa. Mientras que los mónadas existentes son fáciles de utilizar, muchos encuentran difícil de entender cómo definir los mónadas nuevos (que es a veces necesario para ciertos tipos de bibliotecas).[14]

Métodos alternativos por ejemplo Lógica de Hoare y unicidad se han convertido para seguir efectos secundarios en programas. Un cierto uso moderno de las idiomas de la investigación sistemas del efecto para hacer explícito la presencia de efectos secundarios.

Ediciones de la eficacia

Los lenguajes de programación funcionales tienen automático gerencia de la memoria con colección de la basura, en contraste con más viejas idiomas imprescindible tenga gusto de C y del PASCAL que utilicen a gerencia explícita de la memoria. Los lenguajes de programación funcionales se han percibido como menos eficientes en su uso de CPU y memoria que esas idiomas. Sin embargo, muchas idiomas imprescindible modernas por ejemplo Java, Perl, Python, y Rubí también realice a gerencia automática de la memoria.

Los lenguajes de programación funcionales han llegado a ser más eficientes sobre los años. Para los programas que realizan cómputos numéricos intensivos, idiomas funcionales por ejemplo OCaml y Limpio sea similar en velocidad a C. Para los programas que dirigen grande matrices y multidimensional bases de datos, arsenal idiomas funcionales (por ejemplo J y K) fueron diseñados con la optimización de la velocidad en mente.

Las idiomas puramente funcionales tienen una reputación para ser más lentas que idiomas imprescindible. Sin embargo, la inmutabilidad de datos puede, en muchos casos, conducir a la eficacia de la ejecución en permitir que el recopilador haga las asunciones que son inseguras en una lengua imprescindible. La retardación a lo peor fue demostrada para ser exponencial.[15] Las situaciones donde se presentan tales retardaciones ocurren muy raramente en la práctica. Implican, sin embargo, que los sobreconjuntos no funcionales de idiomas applicative son a veces importantes.

Estilos de la codificación

Los programas imprescindible tienden para acentuar la serie de pasos tomados por un programa en realizar una acción, mientras que los programas funcionales tienden para acentuar la composición y el arreglo de funciones, a menudo sin especificar explícito pasos. Un ejemplo simple de dos soluciones a la misma meta de programación (que usa la misma lengua del multi-paradigma Python) ilustra esto.

estilo del imperativo de #
blanco = [] # crea la lista vacía
para artículo en source_list: # itera sobre cada cosa en fuente
trans1 = G(artículo) # transforma el artículo con la función de G ()
trans2 = F(trans1) # transforma en segundo lugar con la función de F ()
blanco.añada(trans2) # agrega el artículo transformado a la blanco

Una versión funcional tiene una diversa sensación a ella:

estilo funcional de #
las idiomas Punto de congelación-orientadas # hacen a menudo que el estándar componga ()
compose2 = lambda F, G: lambda x: F(G(x))
blanco = mapa(compose2(F, G), source_list)

En contraste con el estilo imprescindible que describe los pasos implicaron en el edificio blanco, el estilo funcional describe la relación matemática en medio source_list y blanco.

Vea también

Referencias

  1. ^ a b c Hudak, Paul (el septiembre de 1989). "Concepto, evolución, y uso de lenguajes de programación funcionales". ACM Exámenes que computan 21 (3): 359-411. 
  2. ^ ¿Quién utiliza Erlang para el desarrollo de producto?. Preguntas con frecuencia hechas sobre Erlang. Recuperado encendido 2007-08-05.
  3. ^ ¡El usuario! el horario de 2006 de la conferencia incluye los papeles en el uso comercial de R
  4. ^ Departamento de la matemáticas aplicada, universidad de Colorado. Funcional contra Lenguaje de programación procesal. Recuperado encendido 2006-08-28.
  5. ^ Comerciante de Caml: Aventuras de un programador funcional en Wall Street.
  6. ^ Dimitre Novatchev. El lenguaje de programación funcional XSLT - una prueba con ejemplos. TopXML. Recuperado el 27 de mayo de 2006.
  7. ^ David Mertz. Paradigmas de programación de XML (parte cuatro): Programación funcional acercada al proceso de XML. developerWorks de IBM. Recuperado el 27 de mayo de 2006.
  8. ^ Curry, arroyos de Haskell; Roberto Feys y Craig, Guillermo (1958). Lógica combinatoria. Volumen I. Amsterdam: Compañía que publica de Norte-Holanda. 
  9. ^ McCarthy, Juan (Junio de 1978). "Historia del lisp". En ACM Historia de SIGPLAN de la conferencia de los lenguajes de programación: 173—196.  “La puesta en práctica del lisp comenzó en la caída 1958.”
  10. ^ Dick Pountain. La programación funcional viene de edad. BYTE.com (el agosto de 1994). Recuperado el 31 de agosto de 2006.
  11. ^ Hartel, Pieter; Moleta y Hugh Glaser (el marzo de 2004) de Henk. "La experiencia funcional de C". El diario de la programación funcional 14 (2): 129–135. ; David Mertz. Programación funcional en el Python, parte 3. developerWorks de IBM. Recuperado encendido 2006-09-17.(Parte 1, Parte 2)
  12. ^ McNamara, B. FC++: Programación funcional en C++. Recuperado encendido 2006-05-28.
  13. ^ Donald D. Chamberlin y Raymond F. Boyce (1974). “CONSECUENCIA: Un lenguaje de interrogación inglés estructurado ". Procedimientos de los 1974 ACM SIGFIDET: 249-264. . En este papel, una de las primeras presentaciones formales de los conceptos del SQL (y antes de que el nombre fuera abreviado más adelante), Chamberlin y Boyce acentúa que el SQL fue desarrollado “sin el recurso a los conceptos de variables y de cuantificadores encuadernados”.
  14. ^ Newbern, J. Todo sobre los mónadas: Una guía comprensiva a la teoría y a la práctica de la programación monadic en Haskell. Recuperado encendido 2008-02-14. , “el número escarpado de diversas clases particulares del mónada en el Internet es una buena indicación de la dificultad que mucha gente tiene entender el concepto. Esto es debido a la naturaleza abstracta de mónadas y al hecho de que están utilizados en varias diversas capacidades, que pueden confundir el cuadro de exactamente cuáles un mónada es y para cuál es bueno. “
  15. ^ R.A. DeMillo, S.C. Eisenstat, R.J. Lipton (1980), JACM 27: 123-127.

Lectura adicional

  • Cousineau, individuo y Michel Mauny. El acercamiento funcional a la programación. Cambridge, Reino Unido: Prensa de la universidad de Cambridge, 1998.
  • Curry, arroyos y Feys, Roberto y Craig, Guillermo de Haskell. Lógica combinatoria. Volumen I. Norte-Holanda que publica a Compañía, Amsterdam, 1958.
  • Curry, arroyos e Hindley, J. de Haskell. Roger y Seldin, Jonatán P. Lógica combinatoria. Volumen II. Compañía que publica de Norte-Holanda, Amsterdam * Londres, 1972.
  • Dominus, marca Jason. Perl Higher-Order. Morgan Kaufman. 2005.
  • Felleisen, Matthias, Roberto Findler, Matthew Flatt, y Shriram Krishnamurthi. Cómo diseñar programas HTDP. Presión del MIT. 2001. en línea
  • Graham, Paul. Lisp común del ANSI. Acantilados de Englewood, New Jersey: Prentice Pasillo, 1996.
  • MacLennan, Bruce J. Programación funcional: Práctica y teoría. Addison-Wesley, 1990.
  • Pratt, Terrence, W. y Marvin V. Zelkowitz. Lenguajes de programación: Diseño y puesta en práctica. 3ro ed. Acantilados de Englewood, New Jersey: Prentice Pasillo, 1996.
  • Salus, Peter H. Lenguajes de programación funcionales y de la lógica. Vol. 4 del manual de lenguajes de programación. Indianapolis, Indiana: El publicar técnico de Macmillan, 1998.
  • Thompson, Simon. Haskell: El arte de la programación funcional. Harlow, Inglaterra: Addison-Wesley Longman Limited, 1996.

Acoplamientos externos

The original article is from Wikipedia. To view the original article please click here.
Creative Commons Licence