La programación funcional es un paradigma programado que trata el cómputo como la evaluación de las funciones matemáticas y evita el estado y datos mutables . Acentúa el uso de funciones, al contrario del estilo programado imprescindible que acentúa cambios en estado.
Las idiomas funcionales incluyen el APL, Erlang, Haskell, balbucean, el ml, F# y el esquema . ¡
El funcional que programaba las idiomas, especialmente '' puramente funcional '' del unos, se ha acentuado en gran parte en la academia algo que en el desarrollo de programas comercial. Sin embargo, los lenguajes el de programación funcional notables usados en industria y los usos comerciales incluyen el Erlang (usos concurrentes), el R (estadísticas), el Mathematica (matemáticas simbólica), el ml, el J y el K (análisis financiero), y los lenguajes de programación Domain-specific como el XSLT .
El 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.
El cálculo de la lambda proporciona un marco teórico para las funciones de descripción y su evaluación. Aunque es una abstracción matemática algo que un lenguaje de programación, forma la base de casi todos los lenguajes el de programación funcional hoy.
La lógica combinatoria es una fundación teórica equivalente, desarrollada por el Moses Schönfinkel y el curry de Haskell. Fue desarrollada original para alcanzar un acercamiento más claro a las fundaciones de las matemáticas. La lógica combinatoria comúnmente se percibe como más abstracta que el cálculo de la lambda y se precede le en la invención.
Una lengua funcional-condimentada temprana era lisp, desarrollado por el Juan McCarthy mientras que en MIT para el IBM las computadoras científicas de 700/7000 serie en el a finales de la década de 1950. El lisp introdujo muchas características ahora encontradas en idiomas funcionales, aunque el lisp es técnico una lengua del multiparadigma. El esquema y el Dylan eran tentativas posteriores de simplificar y de mejorar el lisp.
La lengua de tratamiento de la información (IPL) se cita a veces como el primer lenguaje el 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 " generator", que asciende a una función que acepta una función como discusión, y, puesto que es una lengua del montaje-nivel, código puede ser utilizado como datos, así que el IPL se puede mirar como teniendo funciones higher-order. Sin embargo, confía pesadamente en la estructura de la lista que se transforma y características imprescindible similares. Iverson desarrolló el lenguaje de programación del APL en el principios de los 60, descrito en su " de 1962 libros; Un Language." programado; El APL era la influencia primaria en lenguaje de programación del punto de congelación de s de Backus Juan el '. En el principio de los 90, Iverson y el Rogelio Hui crearon un sucesor al APL, el lenguaje de programación J. En los mediados de años 90, el Arturo Whitney, que había trabajado previamente con Iverson, creó el lenguaje de programación K, que se utiliza comercialmente en industrias financieras.
¿El Juan Backus presentó el lenguaje de programación del punto de congelación en su conferencia 1977 de la concesión de Turing puede programando para ser liberado del von Neumann Style? Un estilo funcional y su álgebra de programas. Él define programas funcionales como siendo acumulado de una manera jerárquica por medio de " combinar el forms" eso permite un " álgebra del programs" ; en lengua moderna, esto significa que los programas funcionales siguen el principio de la composicionalidad . El papel de Backus popularizó la investigación en la programación funcional, aunque acentuó el Función-nivel que programaba algo que el estilo del lambda-cálculo que ha venido ser asociado a la programación funcional.
En los años 70 el lenguaje de programación del ml fue creado por el petirrojo Milner en la universidad de Edimburgo, y el David Turner desarrolló el Miranda de la lengua en la universidad de Kent . El ml desarrolló eventual en varios dialectos, el más común cuyo ahora están el Caml objetivo y el ml estándar . El 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.
Un número de conceptos y de paradigmas son específicos a la programación funcional, y generalmente extranjeros al programado imprescindible (programación orientada al objeto incluyendo ). Sin embargo, los lenguajes de programación son a menudo híbridos de varios programadores programados de los paradigmas tan que usan el " sobre todo imperative" las idiomas pudieron haber utilizado algunos de estos conceptos.
Las funciones son higher-order cuando pueden tomar otras funciones como discusiones, y las vuelven como resultados. (El derivado y el Antiderivative en el cálculo son ejemplos de esto.)
Las funciones Higher-order son estrechamente vinculadas a las funciones de primera clase en que 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: " más alto-order" describe un concepto matemático de funciones que funcionen encendido otras funciones, mientras que " primer-class" es un término de informática que describe las entidades de programación del lenguaje 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 que curte, una técnica en la cual una función se aplique a sus discusiones uno a la vez, con cada uso volviendo una nueva función (higher-order) que acepte la discusión siguiente. ¡curtido importante? -->
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 (un " lengua puramente funcional, " por ejemplo el Haskell ) puede utilizar el llamar-por-necesitan la evaluación . Sin embargo, no todas las idiomas funcionales son puras. La familia del balbuceo de idiomas no es pura porque permiten efectos secundarios.
Puesto que las funciones puras no modifican variables compartidas, las funciones puras pueden ser ejecutadas paralelamente sin la interferencia el uno con el otro. Las funciones puras son por lo tanto el Roscar-seguro, que permiten que los intérpretes y los recopiladores utilicen la evaluación del llamar-por-futuro.
Los lenguajes el de programación funcional puros hacen cumplir típicamente la transparencia de referencia, que es la noción que “iguala puede ser substituido para los iguales”: si dos expresiones tienen " equal" los valores (para una cierta noción de la igualdad), entonces uno se pueden substituir para el otro en cualquier expresión más grande sin afectar al resultado del cómputo. Por ejemplo, adentro
lang=" del
un recopilador puede descomponer en factores hacia fuera el f (x) si es puro, transformando el programa a
lang=" del
y eliminando la segunda evaluación (posiblemente) de la llamada costosa al f (x). Esta optimización se llama la eliminación común del subexpression.
Sin embargo, si una función tiene efectos secundarios, la llamada de función no puede ser eliminada. Considerar el fragmento siguiente del programa:
lang=" del
La segunda llamada a random no puede ser eliminada, porque su valor de vuelta puede ser diferente de el de la primera llamada. Semejantemente,
lang=" del
no puede ser optimizado lejos; incluso si 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 detectan funciones puras, y realizan la eliminación común del subexpression para las llamadas de función puras, las bibliotecas precompiladas no exponen generalmente esta información, previniendo llaman a las funciones externas de la optimización lejos. Algunos recopiladores, tales como GCC, agregan las palabras claves adicionales para un programador a explícitamente marcan funciones externas como puras para poder realizarse esta optimización en presencia de bibliotecas precompiladas. El FORTRAN 95 permite que las funciones sin efectos secundarios sean señaladas " pure".
La iteración (colocación) en idiomas funcionales es generalmente realizada vía la repetición . Las funciones recurrentes se invocan, permitiendo que una operación sea realizada repetidamente. La repetición puede requerir mantener un apilado, pero la repetición de la cola se puede reconocer y optimizar por un recopilador en el mismo código usado para ejecutar la iteración en idiomas imprescindible. El estándar de programación del lenguaje del esquema 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 usar funciones de la orden, un Catamorphisms y Anamorphisms (o un " más altos; folds" y " unfolds") siendo los ejemplos más obvios. Tal orden más alta funciona juego que un papel análogo a las estructuras de control incorporadas tales como coloca en las idiomas imprescindible .
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))
Evaluar la función íntima g primero: f → f ((de g (1, 4)) → 1+4) f (5) → 31 del → 5^2+5+1
O evaluar la función exterior f primero: f → 1.4) +1 de g del → (de g (1, 4)) (1.4) ^2+g ((1+4)^2+ (1+4)+1 → 31 del → 5^2+5+1
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 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 ejecutar puesto que las discusiones pasajeras a una función son valores de datos, mientras que con la evaluación no-terminante las discusiones pueden ser expresiones, requiriendo una cierta noción del encierro . Por estas razones, las idiomas funcionales más tempranas, por ejemplo balbucean, evaluación terminante del uso de ISWIM y del ml.
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. 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 son 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 llevó al desarrollo de la 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 a ser utilizada por idiomas funcionales puras tales como Miranda, limpio y Haskell ; sin embargo muchas otras idiomas funcionales más recientes continúan utilizando la evaluación terminante.
La programación funcional es muy diferente programado imprescindible. Las diferencias más significativas provienen el hecho de que la programación funcional evita los efectos secundarios, que se utilizan en la programación imprescindible para ejecutar el estado y la entrada-salida. La programación funcional pura del rechaza efectos secundarios totalmente. El rechazo de efectos secundarios preve la 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.
Funciones más altas de la orden 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 devuelve una lista de los resultados.
El lenguaje el de programación funcional puro Haskell los ejecuta usar las mónadas, derivadas de la teoría de la categoría. Las 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 las mónadas existentes son fáciles de utilizar, muchas encuentran difícil entender cómo definir las nuevas mónadas (que es a veces necesario para ciertos tipos de bibliotecas). ¡
Los métodos alternativos tales como lógica de Hoare y unicidad se han desarrollado para seguir efectos secundarios en programas. Algunas idiomas modernas de la investigación utilizan los sistemas del efecto para hacer explícito la presencia de efectos secundarios. ¡
Los lenguajes el de programación funcional han llegado a ser más eficientes durante los años. Para los programas que se realizan los cómputos numéricos intensivos, las idiomas funcionales tales como OCaml y el limpio son similares en velocidad al C . Para los programas que dirigen las matrices grandes y las idiomas funcionales multidimensionales del arsenal de las bases de datos (tales como J y K ) fueron diseñadas 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, llevar 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. Las situaciones donde se presentan tales retardaciones ocurren muy raramente en la práctica. Implican, sin embargo, que los sobreconjuntos no funcionales de idiomas aplicables son a veces importantes.
lang=" del
Una versión funcional tiene una diversa sensación a ella:
lang=" del
En contraste con el estilo imprescindible que describe los pasos implicaron en el edificio target, el estilo funcional describe la relación matemática entre source_list y target.
.
| Random links: | David Byrne (músico) | Tricotomía (matemáticas) | Batfink | Simetría quebrada | Karl Ullmann |