stringtranslate.com

Programación funcional

En informática , la programación funcional es un paradigma de programación en el que los programas se construyen aplicando y componiendo funciones . Es un paradigma de programación declarativa en el que las definiciones de funciones son árboles de expresiones que asignan valores a otros valores, en lugar de una secuencia de declaraciones imperativas que actualizan el estado de ejecución del programa.

En la programación funcional, las funciones se tratan como ciudadanos de primera clase , lo que significa que pueden vincularse a nombres (incluidos identificadores locales ), pasarse como argumentos y devolverse desde otras funciones, tal como puede hacerlo cualquier otro tipo de datos . Esto permite escribir programas en un estilo declarativo y componible , donde pequeñas funciones se combinan de forma modular .

La programación funcional a veces se trata como sinónimo de programación puramente funcional , un subconjunto de la programación funcional que trata todas las funciones como funciones matemáticas deterministas o funciones puras . Cuando se llama a una función pura con algunos argumentos dados, siempre devolverá el mismo resultado y no puede verse afectada por ningún estado mutable u otros efectos secundarios . Esto contrasta con los procedimientos impuros , comunes en la programación imperativa , que pueden tener efectos secundarios (como modificar el estado del programa o recibir información de un usuario). Los defensores de la programación puramente funcional afirman que al restringir los efectos secundarios, los programas pueden tener menos errores , ser más fáciles de depurar y probar y ser más adecuados para la verificación formal . [1] [2]

La programación funcional tiene sus raíces en el mundo académico , evolucionando a partir del cálculo lambda , un sistema formal de computación basado únicamente en funciones. Históricamente, la programación funcional ha sido menos popular que la programación imperativa, pero muchos lenguajes funcionales se están utilizando hoy en día en la industria y la educación, incluidos Common Lisp , Scheme , [3] [4] [5] [6] Clojure , Wolfram Language , [7] [8] Raqueta , [9] Erlang , [10] [11] [12] Elixir , [13] OCaml , [14] [15] Haskell , [16] [17] y F# . [18] [19] La programación funcional también es clave para algunos lenguajes que han tenido éxito en dominios específicos, como JavaScript en la Web, [20] R en estadística, [21] [22] J , K y Q en análisis financiero, y XQuery / XSLT para XML . [23] [24] Los lenguajes declarativos de dominio específico como SQL y Lex / Yacc utilizan algunos elementos de programación funcional, como no permitir valores mutables . [25] Además, muchos otros lenguajes de programación admiten la programación en un estilo funcional o han implementado características de programación funcional, como C++11 , C# , [26] Kotlin , [27] Perl , [28] PHP , [29 ] Python , [30] Go , [31] Rust , [32] Raku , [33] Scala , [34] y Java (desde Java 8) . [35]

Historia

El cálculo lambda , desarrollado en la década de 1930 por Alonzo Church , es un sistema formal de cálculo construido a partir de la aplicación de funciones . En 1937, Alan Turing demostró que el cálculo lambda y las máquinas de Turing son modelos de cálculo equivalentes, [36] demostrando que el cálculo lambda es el de Turing completo . El cálculo lambda constituye la base de todos los lenguajes de programación funcionales. Moses Schönfinkel y Haskell Curry desarrollaron una formulación teórica equivalente, la lógica combinatoria , en las décadas de 1920 y 1930. [37]

Posteriormente, Church desarrolló un sistema más débil, el cálculo lambda de tipo simple , que amplió el cálculo lambda asignando un tipo de datos a todos los términos. [38] Esto forma la base para la programación funcional tipada estáticamente.

El primer lenguaje de programación funcional de alto nivel , Lisp , fue desarrollado a finales de la década de 1950 para la serie de computadoras científicas IBM 700/7000 por John McCarthy mientras estaba en el Instituto Tecnológico de Massachusetts (MIT). [39] Las funciones Lisp se definieron utilizando la notación lambda de Church, ampliada con una construcción de etiqueta para permitir funciones recursivas . [40] Lisp introdujo por primera vez muchas características paradigmáticas de la programación funcional, aunque los primeros Lisp eran lenguajes multiparadigma e incorporaron soporte para numerosos estilos de programación a medida que evolucionaban nuevos paradigmas. Dialectos posteriores, como Scheme y Clojure , y derivados como Dylan y Julia , buscaron simplificar y racionalizar Lisp en torno a un núcleo limpiamente funcional, mientras que Common Lisp fue diseñado para preservar y actualizar las características paradigmáticas de los numerosos dialectos más antiguos que reemplazó. [41]

El lenguaje de procesamiento de información (IPL), 1956, a veces se cita como el primer lenguaje de programación funcional basado en computadora. [42] Es un lenguaje de estilo ensamblador para manipular listas de símbolos. Tiene una noción de generador , que equivale a una función que acepta una función como argumento y, dado que es un lenguaje de nivel ensamblador, el código puede ser datos, por lo que se puede considerar que IPL tiene funciones de orden superior. Sin embargo, depende en gran medida de la estructura de la lista mutante y de características imperativas similares.

Kenneth E. Iverson desarrolló APL a principios de la década de 1960, como se describe en su libro de 1962 Un lenguaje de programación ( ISBN  9780471430148 ). APL fue la principal influencia en el FP de John Backus . A principios de la década de 1990, Iverson y Roger Hui crearon J. A mediados de la década de 1990, Arthur Whitney , que había trabajado anteriormente con Iverson, creó K , que se utiliza comercialmente en las industrias financieras junto con su descendiente Q.

A mediados de la década de 1960, Peter Landin inventó la máquina SECD , [43] la primera máquina abstracta para un lenguaje de programación funcional, [44] describió una correspondencia entre ALGOL 60 y el cálculo lambda , [45] [46] y propuso la programación ISWIM . idioma. [47]

John Backus presentó FP en su conferencia del Premio Turing de 1977 "¿Se puede liberar la programación del estilo von Neumann ? Un estilo funcional y su álgebra de programas". [48] ​​Define los programas funcionales como aquellos que se construyen de forma jerárquica mediante "combinación de formas" que permiten un "álgebra de programas"; En lenguaje moderno, esto significa que los programas funcionales siguen el principio de composicionalidad . [ cita necesaria ] El artículo de Backus popularizó la investigación sobre programación funcional, aunque enfatizó la programación a nivel de función en lugar del estilo de cálculo lambda ahora asociado con la programación funcional.

El lenguaje ML de 1973 fue creado por Robin Milner en la Universidad de Edimburgo , y David Turner desarrolló el lenguaje SASL en la Universidad de St Andrews . También en Edimburgo en la década de 1970, Burstall y Darlington desarrollaron el lenguaje funcional NPL . [49] NPL se basó en las ecuaciones de recursión de Kleene y se introdujo por primera vez en su trabajo sobre transformación de programas. [50] Burstall, MacQueen y Sannella luego incorporaron la verificación de tipos polimórficos de ML para producir el lenguaje Hope . [51] ML finalmente se desarrolló en varios dialectos, los más comunes de los cuales ahora son OCaml y Standard ML .

En la década de 1970, Guy L. Steele y Gerald Jay Sussman desarrollaron Scheme , como se describe en los Lambda Papers y en el libro de texto de 1985 Structure and Interpretation of Computer Programs . Scheme fue el primer dialecto de lisp que utilizó alcance léxico y requirió optimización de llamadas de cola , características que fomentan la programación funcional.

En la década de 1980, Per Martin-Löf desarrolló la teoría de tipos intuicionista (también llamada teoría de tipos constructivos ), que asociaba programas funcionales con pruebas constructivas expresadas como tipos dependientes . Esto condujo a nuevos enfoques para la demostración interactiva de teoremas y ha influido en el desarrollo de lenguajes de programación funcionales posteriores. [ cita necesaria ]

El lenguaje funcional perezoso Miranda , desarrollado por David Turner, apareció inicialmente en 1985 y tuvo una fuerte influencia en Haskell . Con Miranda como propietario, Haskell comenzó con un consenso en 1987 para formar un estándar abierto para la investigación de programación funcional; Los lanzamientos de implementación han estado en curso desde 1990.

Más recientemente, ha encontrado uso en nichos como el CAD paramétrico en el lenguaje OpenSCAD construido sobre el marco CGAL , aunque su restricción en la reasignación de valores (todos los valores se tratan como constantes) ha generado confusión entre los usuarios que no están familiarizados con la programación funcional como un concepto. [52]

La programación funcional sigue utilizándose en entornos comerciales. [53] [54] [55]

Conceptos

Varios conceptos [56] y paradigmas son específicos de la programación funcional y, en general, ajenos a la programación imperativa (incluida la programación orientada a objetos ). Sin embargo, los lenguajes de programación a menudo atienden a varios paradigmas de programación, por lo que los programadores que utilizan lenguajes "principalmente imperativos" pueden haber utilizado algunos de estos conceptos. [57]

Funciones de primera clase y de orden superior

Las funciones de orden superior son funciones que pueden tomar otras funciones como argumentos o devolverlas como resultados. En cálculo, un ejemplo de función de orden superior es el operador diferencial , que devuelve la derivada de una función .

Las funciones de orden superior están estrechamente relacionadas con las funciones de primera clase en el sentido de que tanto las funciones de orden superior como las funciones de primera clase permiten funciones como argumentos y resultados de otras funciones. La distinción entre los dos es sutil: "orden superior" describe un concepto matemático de funciones que operan sobre otras funciones, mientras que "primera clase" es un término informático para entidades de lenguaje de programación que no tienen restricciones en su uso (por lo tanto, primera Las funciones de clase pueden aparecer en cualquier parte del programa que otras entidades de primera clase, como los números, incluso como argumentos de otras funciones y como sus valores de retorno).

Las funciones de orden superior permiten la aplicación parcial o currying , una técnica que aplica una función a sus argumentos uno por uno, y cada aplicación devuelve una nueva función que acepta el siguiente argumento. Esto permite a un programador expresar de manera sucinta, por ejemplo, la función sucesora como el operador de suma aplicado parcialmente al número uno natural .

Funciones puras

Las funciones puras (o expresiones) no tienen efectos secundarios (memoria o E/S). Esto significa que las funciones puras tienen varias propiedades útiles, muchas de las cuales pueden usarse para optimizar el código:

Si bien la mayoría de los compiladores de lenguajes de programación imperativos detectan funciones puras y realizan la eliminación de subexpresiones comunes para llamadas a funciones puras, no siempre pueden hacer esto para bibliotecas precompiladas, que generalmente no exponen esta información, lo que evita optimizaciones que involucran esas funciones externas. Algunos compiladores, como gcc , agregan palabras clave adicionales para que un programador marque explícitamente funciones externas como puras, para permitir tales optimizaciones. Fortran 95 también permite designar funciones puras . [58] C++11 agregó constexpruna palabra clave con semántica similar.

recursividad

La iteración (bucle) en lenguajes funcionales generalmente se logra mediante recursividad . Las funciones recursivas se invocan a sí mismas, permitiendo que una operación se repita hasta llegar al caso base . En general, la recursividad requiere mantener una pila , que consume espacio en una cantidad lineal hasta la profundidad de la recursividad. Esto podría hacer que el uso de la recursividad sea prohibitivamente costoso en lugar de los bucles imperativos. Sin embargo, un compilador puede reconocer y optimizar una forma especial de recursividad conocida como recursividad de cola en el mismo código utilizado para implementar la iteración en lenguajes imperativos. La optimización de la recursión de cola se puede implementar transformando el programa en un estilo de paso de continuación durante la compilación, entre otros enfoques.

El estándar del lenguaje Scheme requiere implementaciones que admitan la recursividad de cola adecuada, lo que significa que deben permitir un número ilimitado de llamadas de cola activas. [59] [60] La recursión de cola adecuada no es simplemente una optimización; es una característica del lenguaje que asegura a los usuarios que pueden usar la recursividad para expresar un bucle y hacerlo sería seguro para el espacio. [61] Además, contrariamente a su nombre, representa todas las llamadas de cola, no solo la recursividad de cola. Si bien la recursión de cola adecuada generalmente se implementa convirtiendo el código en bucles imperativos, las implementaciones pueden implementarlo de otras maneras. Por ejemplo, Chicken mantiene intencionalmente una pila y deja que se desborde . Sin embargo, cuando esto sucede, su recolector de basura reclamará espacio, [62] permitiendo un número ilimitado de llamadas de cola activas aunque no convierta la recursividad de cola en un bucle.

Los patrones comunes de recursividad se pueden abstraer utilizando funciones de orden superior, siendo los catamorfismos y anamorfismos (o "pliegues" y "desplegados") los ejemplos más obvios. Estos esquemas de recursividad desempeñan un papel análogo a las estructuras de control integradas, como los bucles en los lenguajes imperativos .

La mayoría de los lenguajes de programación funcional de propósito general permiten la recursividad sin restricciones y son Turing completos , lo que hace que el problema de detención sea indecidible , puede causar falta de solidez en el razonamiento ecuacional y generalmente requiere la introducción de inconsistencia en la lógica expresada por el sistema de tipos del lenguaje . Algunos lenguajes de propósito especial como Coq sólo permiten recursividad bien fundada y son fuertemente normalizadores (los cálculos no terminantes sólo pueden expresarse con flujos infinitos de valores llamados codata ). Como consecuencia, estos lenguajes no logran ser completos según Turing y expresar ciertas funciones en ellos es imposible, pero aun así pueden expresar una amplia clase de cálculos interesantes evitando al mismo tiempo los problemas introducidos por la recursividad sin restricciones. La programación funcional limitada a una recursividad bien fundada con algunas otras restricciones se denomina programación funcional total . [63]

Evaluación estricta versus no estricta

Los lenguajes funcionales se pueden clasificar según si utilizan evaluación estricta (ansiosa) o no estricta (perezosa) , conceptos que se refieren a cómo se procesan los argumentos de una función cuando se evalúa una expresión. La diferencia técnica está en la semántica denotacional de las expresiones que contienen cálculos fallidos o divergentes. Bajo evaluación estricta, la evaluación de cualquier término que contenga un subtérmino reprobado falla. Por ejemplo, la expresión:

longitud de impresión ([2+1, 3*2, 1/0, 5-4])

falla bajo evaluación estricta debido a la división por cero en el tercer elemento de la lista. En evaluación diferida, la función de longitud devuelve el valor 4 (es decir, el número de elementos de la lista), ya que al evaluarla no se intentan evaluar los términos que componen la lista. En resumen, la evaluación estricta siempre evalúa completamente los argumentos de la función antes de invocar la función. La evaluación diferida no evalúa los argumentos de la función a menos que sus valores sean necesarios para evaluar la llamada a la función en sí.

La estrategia de implementación habitual para la evaluación diferida en lenguajes funcionales es la reducción de gráficos . [64] La evaluación diferida se utiliza de forma predeterminada en varios lenguajes funcionales puros, incluidos Miranda , Clean y Haskell .

Hughes (1984) defiende la evaluación diferida como mecanismo para mejorar la modularidad del programa mediante la separación de preocupaciones , facilitando la implementación independiente de productores y consumidores de flujos de datos. [2] Launchbury 1993 describe algunas dificultades que introduce la evaluación perezosa, particularmente al analizar los requisitos de almacenamiento de un programa, y ​​propone una semántica operativa para ayudar en dicho análisis. [65] Harper 2009 propone incluir evaluación estricta y perezosa en el mismo idioma, utilizando el sistema de tipos del idioma para distinguirlas. [66]

Sistemas de tipos

Especialmente desde el desarrollo de la inferencia de tipos Hindley-Milner en la década de 1970, los lenguajes de programación funcionales han tendido a utilizar cálculo lambda tipado , rechazando todos los programas no válidos en el momento de la compilación y arriesgándose a errores de falso positivo , a diferencia del cálculo lambda sin tipo , que acepta todos los válidos. programas en tiempo de compilación y corre el riesgo de errores de falso negativo , utilizados en Lisp y sus variantes (como Scheme ), ya que rechazan todos los programas no válidos en tiempo de ejecución cuando la información es suficiente para no rechazar programas válidos. El uso de tipos de datos algebraicos hace que la manipulación de estructuras de datos complejas sea conveniente; la presencia de una fuerte verificación de tipos en tiempo de compilación hace que los programas sean más confiables en ausencia de otras técnicas de confiabilidad como el desarrollo basado en pruebas , mientras que la inferencia de tipos libera al programador de la necesidad de declarar tipos manualmente al compilador en la mayoría de los casos.

Algunos lenguajes funcionales orientados a la investigación, como Coq , Agda , Cayenne y Epigram , se basan en la teoría de tipos intuicionista , que permite que los tipos dependan de términos. Estos tipos se denominan tipos dependientes . Estos sistemas de tipos no tienen inferencia de tipos decidibles y son difíciles de entender y programar. [67] [68] [69] [70] Pero los tipos dependientes pueden expresar proposiciones arbitrarias en lógica de orden superior . A través del isomorfismo de Curry-Howard , entonces, los programas bien tipificados en estos lenguajes se convierten en un medio para escribir pruebas matemáticas formales a partir de las cuales un compilador puede generar código certificado . Si bien estos lenguajes son de interés principalmente en la investigación académica (incluidas las matemáticas formalizadas ), también han comenzado a usarse en ingeniería. Compcert es un compilador para un subconjunto del lenguaje de programación C escrito en Coq y verificado formalmente. [71]

Se puede implementar una forma limitada de tipos dependientes llamados tipos de datos algebraicos generalizados (GADT) de una manera que proporcione algunos de los beneficios de la programación con tipos dependientes y al mismo tiempo evite la mayoría de sus inconvenientes. [72] Los GADT están disponibles en el compilador Glasgow Haskell , en OCaml [73] y en Scala , [74] y se han propuesto como adiciones a otros lenguajes, incluidos Java y C#. [75]

Transparencia referencial

Los programas funcionales no tienen declaraciones de asignación, es decir, el valor de una variable en un programa funcional nunca cambia una vez definida. Esto elimina cualquier posibilidad de efectos secundarios porque cualquier variable puede reemplazarse con su valor real en cualquier punto de ejecución. Entonces, los programas funcionales son referencialmente transparentes. [76]

Considere la declaración de asignación de Cx=x * 10 , esto cambia el valor asignado a la variable x. Digamos que el valor inicial de xfue 1, luego dos evaluaciones consecutivas de la variable xarrojan 10y 100respectivamente. Claramente, reemplazar x=x * 10con 10o 100le da al programa un significado diferente, por lo que la expresión no es referencialmente transparente. De hecho, las declaraciones de asignación nunca son referencialmente transparentes.

Ahora, considere otra función como la que es transparente, ya que no cambia implícitamente la entrada x y, por lo tanto, no tiene tales efectos secundarios . Los programas funcionales utilizan exclusivamente este tipo de funciones y, por tanto, son referencialmente transparentes.int plusone(int x) {return x+1;}

Estructuras de datos

Las estructuras de datos puramente funcionales a menudo se representan de forma diferente a sus contrapartes imperativas . [77] Por ejemplo, la matriz con tiempos constantes de acceso y actualización es un componente básico de la mayoría de los lenguajes imperativos, y muchas estructuras de datos imperativas, como la tabla hash y el montón binario , se basan en matrices. Los arrays pueden ser sustituidos por mapas o listas de acceso aleatorio, que admiten implementación puramente funcional, pero tienen tiempos de acceso y actualización logarítmicos . Las estructuras de datos puramente funcionales tienen persistencia , una propiedad de mantener sin modificar las versiones anteriores de la estructura de datos. En Clojure, las estructuras de datos persistentes se utilizan como alternativas funcionales a sus contrapartes imperativas. Los vectores persistentes, por ejemplo, utilizan árboles para una actualización parcial. Llamar al método de inserción dará como resultado la creación de algunos nodos, pero no de todos. [78]

Comparación con la programación imperativa

La programación funcional es muy diferente de la programación imperativa . Las diferencias más significativas surgen del hecho de que la programación funcional evita los efectos secundarios , que se utilizan en la programación imperativa para implementar el estado y las E/S. La programación funcional pura evita por completo los efectos secundarios y proporciona transparencia referencial.

Las funciones de orden superior rara vez se utilizan en la programación imperativa anterior. Un programa imperativo tradicional podría utilizar un bucle para recorrer y modificar una lista. Un programa funcional, por otro lado, probablemente usaría una función "mapa" de orden superior que toma una función y una lista, generando y devolviendo una nueva lista aplicando la función a cada elemento de la lista.

Programación imperativa versus funcional

Los siguientes dos ejemplos (escritos en JavaScript ) logran el mismo efecto: multiplican todos los números pares de una matriz por 10 y los suman todos, almacenando la suma final en la variable "resultado".

Bucle imperativo tradicional:

const ListaNúm = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]; dejar resultado = 0 ; for ( let i = 0 ; i < numList . length ; i ++ ) { if ( numList [ i ] % 2 === 0 ) { resultado += numList [ i ] * 10 ; } }                                     

Programación funcional con funciones de orden superior:

resultado constante = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] . filtro ( n => n % 2 === 0 ) . mapa ( a => a * 10 ) . reducir (( a , b ) => a + b , 0 );                               

Simulando estado

Hay tareas (por ejemplo, mantener el saldo de una cuenta bancaria) que a menudo parecen implementarse de forma más natural con el Estado. La programación funcional pura realiza estas tareas, y las tareas de E/S, como aceptar entradas del usuario e imprimir en la pantalla, de una manera diferente.

El lenguaje de programación funcional puro Haskell los implementa usando mónadas , derivadas de la teoría de categorías . [79] Las mónadas ofrecen una manera de abstraer ciertos tipos de patrones computacionales, incluido (pero no limitado a) el modelado de cálculos con estado mutable (y otros efectos secundarios como E/S) de manera imperativa sin perder pureza. Si bien las mónadas existentes pueden ser fáciles de aplicar en un programa, con plantillas y ejemplos adecuados, a muchos estudiantes les resulta difícil entenderlas conceptualmente, por ejemplo, cuando se les pide que definan nuevas mónadas (lo que a veces es necesario para ciertos tipos de bibliotecas). [80]

Los lenguajes funcionales también simulan estados pasando por estados inmutables. Esto se puede hacer haciendo que una función acepte el estado como uno de sus parámetros y devuelva un nuevo estado junto con el resultado, dejando el estado anterior sin cambios. [81]

Los lenguajes funcionales impuros suelen incluir un método más directo para gestionar el estado mutable. Clojure , por ejemplo, utiliza referencias administradas que se pueden actualizar aplicando funciones puras al estado actual. Este tipo de enfoque permite la mutabilidad y al mismo tiempo promueve el uso de funciones puras como la forma preferida de expresar cálculos. [ cita necesaria ]

Se han desarrollado métodos alternativos como la lógica de Hoare y la unicidad para rastrear los efectos secundarios en los programas. Algunos lenguajes de investigación modernos utilizan sistemas de efectos para hacer explícita la presencia de efectos secundarios. [ cita necesaria ]

Problemas de eficiencia

Los lenguajes de programación funcional suelen ser menos eficientes en el uso de CPU y memoria que los lenguajes imperativos como C y Pascal . [82] Esto está relacionado con el hecho de que algunas estructuras de datos mutables, como las matrices, tienen una implementación muy sencilla utilizando el hardware actual. Se puede acceder a los arreglos planos de manera muy eficiente con CPU profundamente canalizadas, captarlos previamente de manera eficiente a través de cachés (sin una búsqueda compleja de punteros) o manejarlos con instrucciones SIMD. Tampoco es fácil crear sus contrapartes inmutables de propósito general igualmente eficientes. Para los lenguajes puramente funcionales, la desaceleración en el peor de los casos es logarítmica en el número de celdas de memoria utilizadas, porque la memoria mutable puede representarse mediante una estructura de datos puramente funcional con un tiempo de acceso logarítmico (como un árbol equilibrado). [83] Sin embargo, estas desaceleraciones no son universales. Para los programas que realizan cálculos numéricos intensivos, los lenguajes funcionales como OCaml y Clean son sólo un poco más lentos que C según The Computer Language Benchmarks Game . [84] Para programas que manejan matrices grandes y bases de datos multidimensionales , se diseñaron lenguajes funcionales de matrices (como J y K ) con optimizaciones de velocidad.

En muchos casos, la inmutabilidad de los datos puede conducir a la eficiencia de la ejecución al permitir que el compilador haga suposiciones que no son seguras en un lenguaje imperativo, lo que aumenta las oportunidades de expansión en línea . [85]

La evaluación diferida también puede acelerar el programa, incluso de forma asintótica, mientras que puede ralentizarlo como máximo en un factor constante (sin embargo, puede introducir pérdidas de memoria si se usa incorrectamente). Launchbury 1993 [65] analiza cuestiones teóricas relacionadas con las pérdidas de memoria debidas a una evaluación perezosa, y O'Sullivan et al. 2008 [86] brindan algunos consejos prácticos para analizarlos y solucionarlos. Sin embargo, las implementaciones más generales de evaluación diferida que hacen un uso extensivo de código y datos desreferenciados funcionan mal en procesadores modernos con canalizaciones profundas y cachés multinivel (donde una falla de caché puede costar cientos de ciclos) [ cita necesaria ] .

Programación funcional en lenguajes no funcionales.

Es posible utilizar un estilo de programación funcional en lenguajes que tradicionalmente no se consideran lenguajes funcionales. [87] Por ejemplo, tanto D [88] como Fortran 95 [58] admiten explícitamente funciones puras.

JavaScript , Lua , [89] Python y Go [90] tenían funciones de primera clase desde sus inicios. [91] Python tenía soporte para " lambda ", " map ", " reduce " y " filter " en 1994, así como cierres en Python 2.2, [92] aunque Python 3 relegó "reduce" al functoolsmódulo de biblioteca estándar. [93] Se han introducido funciones de primera clase en otros lenguajes convencionales como PHP 5.3, Visual Basic 9 , C# 3.0, C++11 y Kotlin . [27] [ cita necesaria ]

En PHP, las clases anónimas , cierres y lambdas son totalmente compatibles. Se están desarrollando bibliotecas y extensiones de lenguaje para estructuras de datos inmutables para ayudar a la programación en el estilo funcional.

En Java , a veces se pueden utilizar clases anónimas para simular cierres; [94] sin embargo, las clases anónimas no siempre son reemplazos adecuados de los cierres porque tienen capacidades más limitadas. [95] Java 8 admite expresiones lambda como reemplazo de algunas clases anónimas. [96]

En C# , las clases anónimas no son necesarias porque los cierres y lambdas son totalmente compatibles. Se están desarrollando bibliotecas y extensiones de lenguaje para estructuras de datos inmutables para ayudar a la programación en el estilo funcional en C#.

Muchos patrones de diseño orientado a objetos se pueden expresar en términos de programación funcional: por ejemplo, el patrón de estrategia simplemente dicta el uso de una función de orden superior, y el patrón de visitante corresponde aproximadamente a un catamorfismo o pliegue .

De manera similar, la idea de datos inmutables de la programación funcional a menudo se incluye en los lenguajes de programación imperativos, [97] por ejemplo la tupla en Python, que es una matriz inmutable, y Object.freeze() en JavaScript. [98]

Comparación con la programación lógica

La programación lógica puede verse como una generalización de la programación funcional, en la que las funciones son un caso especial de relaciones. [99] Por ejemplo, la función madre(X) = Y, (cada X tiene sólo una madre Y) puede representarse mediante la relación madre(X, Y). Mientras que las funciones tienen un patrón estricto de argumentos de entrada y salida, las relaciones se pueden consultar con cualquier patrón de entradas y salidas. Considere el siguiente programa lógico:

madre ( charles ,  elizabeth ). madre ( harry ,  diana ).

El programa se puede consultar, como un programa funcional, para generar madres a partir de niños:

?-  madre ( harry ,  X ). X  =  diana . ?-  madre ( charles ,  X ). X  =  Isabel .

Pero también se puede consultar al revés , para generar hijos:

?-  madre ( X ,  elizabeth ). X  =  Carlos . ?-  madre ( X ,  diana ). X  =  Harry .

Incluso se puede utilizar para generar todas las instancias de la relación madre:

?-  madre ( X ,  Y ). X  =  Carlos , Y  =  Isabel . X  =  harry , Y  =  diana .

En comparación con la sintaxis relacional, la sintaxis funcional es una notación más compacta para funciones anidadas. Por ejemplo, la definición de abuela materna en sintaxis funcional se puede escribir en forma anidada:

abuela_materna ( X )  =  madre ( madre ( X )).

La misma definición en notación relacional debe escribirse en forma no anidada:

abuela_materna ( X ,  Y )  : -  madre ( X ,  Z ),  madre ( Z ,  Y ).

Aquí :-significa si y , significa y .

Sin embargo, la diferencia entre ambas representaciones es simplemente sintáctica. En Ciao Prolog, las relaciones se pueden anidar, como funciones en programación funcional: [100]

abuelo ( X )  :=  padre ( padre ( X )). padre ( X )  : =  madre ( X ). padre ( X )  : =  padre ( X ).madre ( charles )  : =  elizabeth . padre ( charles )  : =  phillip . madre ( harry )  : =  diana . padre ( harry )  : =  charles .?-  abuelo ( X , Y ). X  =  harry , Y  =  elizabeth . X  =  harry , Y  =  phillip .

Ciao transforma la notación similar a una función en forma relacional y ejecuta el programa lógico resultante utilizando la estrategia de ejecución estándar Prolog.

Aplicaciones

Hojas de cálculo

Las hojas de cálculo pueden considerarse una forma de sistema de programación funcional puro, de orden cero y de evaluación estricta. [101] Sin embargo, las hojas de cálculo generalmente carecen de funciones de orden superior, así como de reutilización de código, y en algunas implementaciones, también carecen de recursividad. Se han desarrollado varias extensiones para programas de hojas de cálculo para permitir funciones reutilizables y de orden superior, pero hasta ahora siguen siendo principalmente de naturaleza académica. [102]

Academia

La programación funcional es un área activa de investigación en el campo de la teoría del lenguaje de programación . Hay varios lugares de publicaciones revisadas por pares que se centran en la programación funcional, incluida la Conferencia Internacional sobre Programación Funcional , el Journal of Functional Programming y el Simposio sobre tendencias en programación funcional .

Industria

La programación funcional se ha empleado en una amplia gama de aplicaciones industriales. Por ejemplo, Erlang , que fue desarrollado por la empresa sueca Ericsson a finales de los años 1980, se utilizó originalmente para implementar sistemas de telecomunicaciones tolerantes a fallos , [11] pero desde entonces se ha hecho popular para crear una gama de aplicaciones en empresas como Nortel , Facebook , Électricité de France y WhatsApp . [10] [12] [103] [104] [105] Scheme , un dialecto de Lisp , se utilizó como base para varias aplicaciones en las primeras computadoras Apple Macintosh [3] [4] y se ha aplicado a problemas como el entrenamiento - software de simulación [5] y control del telescopio . [6] OCaml , que se introdujo a mediados de la década de 1990, ha tenido uso comercial en áreas como análisis financiero, [14] verificación de controladores , programación de robots industriales y análisis estático de software integrado . [15] Haskell , aunque inicialmente concebido como un lenguaje de investigación, [17] también se ha aplicado en áreas como sistemas aeroespaciales, diseño de hardware y programación web. [16] [17]

Otros lenguajes de programación funcional que se han utilizado en la industria incluyen Scala , [106] F# , [18] [19] Wolfram Language , [7] Lisp , [107] Standard ML [108] [109] y Clojure. [110]

Las "plataformas" funcionales han sido populares en las finanzas para el análisis de riesgos (particularmente entre los grandes bancos de inversión). Los factores de riesgo se codifican como funciones que forman gráficos (categorías) interdependientes para medir las correlaciones en los cambios del mercado, de manera similar a las optimizaciones de la base de Gröbner , pero también para marcos regulatorios como el Análisis y Revisión Integral de Capital . Dado el uso de variaciones de OCaml y Caml en las finanzas, estos sistemas a veces se consideran relacionados con una máquina abstracta categórica . La programación funcional está fuertemente influenciada por la teoría de categorías . [ cita necesaria ]

Educación

Muchas universidades enseñan programación funcional. [111] [112] [113] [114] Algunos lo tratan como un concepto introductorio de programación [114] mientras que otros enseñan primero métodos de programación imperativos. [113] [115]

Fuera de la informática, la programación funcional se utiliza para enseñar conceptos geométricos y algebraicos y de resolución de problemas. [116] También se ha utilizado para enseñar mecánica clásica, como en el libro Estructura e interpretación de la mecánica clásica .

Ver también

notas y referencias

  1. ^ Hudak, Paul (septiembre de 1989). «Concepción, evolución y aplicación de lenguajes de programación funcionales» (PDF) . Encuestas de Computación ACM . 21 (3): 359–411. doi :10.1145/72551.72554. S2CID  207637854.
  2. ^ ab Hughes, John (1984). "Por qué es importante la programación funcional".
  3. ^ ab Clinger, Will (1987). "Multitarea y MacScheme". MacTech . 3 (12) . Consultado el 28 de agosto de 2008 .
  4. ^ ab Hartheimer, Anne (1987). "Programación de un editor de texto en MacScheme+Toolsmith". MacTech . 3 (1). Archivado desde el original el 29 de junio de 2011 . Consultado el 28 de agosto de 2008 .
  5. ^ ab Kidd, Eric. Plan de capacitación en respuesta al terrorismo. CUFP 2007 . Consultado el 26 de agosto de 2009 .
  6. ^ ab Cleis, Richard. Esquema en el espacio. CUFP 2006 . Consultado el 26 de agosto de 2009 .
  7. ^ ab "Guía de Wolfram Language: programación funcional". 2015 . Consultado el 24 de agosto de 2015 .
  8. ^ "Lenguaje de programación funcional versus procedimental". Departamento de Matemáticas Aplicadas . Universidad de Colorado. Archivado desde el original el 13 de noviembre de 2007.
  9. ^ "Secuencias de comandos basadas en estados en Uncharted 2" (PDF) . Archivado desde el original (PDF) el 15 de diciembre de 2012 . Consultado el 8 de agosto de 2011 .
  10. ^ ab "¿Quién utiliza Erlang para el desarrollo de productos?". Preguntas frecuentes sobre Erlang . Consultado el 27 de abril de 2018 .
  11. ^ ab Armstrong, Joe (junio de 2007). "Una historia de Erlang". Actas de la tercera conferencia ACM SIGPLAN sobre Historia de los lenguajes de programación . Tercer Congreso ACM SIGPLAN sobre Historia de los Lenguajes de Programación. San Diego, California. doi :10.1145/1238844.1238850. ISBN 9781595937667.
  12. ^ ab Larson, Jim (marzo de 2009). "Erlang para programación concurrente". Comunicaciones de la ACM . 52 (3): 48. doi : 10.1145/1467247.1467263 . S2CID  524392.
  13. ^ "El lenguaje de programación Elixir" . Consultado el 14 de febrero de 2021 .
  14. ^ ab Minsky, Yaron; Semanas, Stephen (julio de 2008). "Caml Trading: experiencias con programación funcional en Wall Street". Revista de programación funcional . 18 (4): 553–564. doi : 10.1017/S095679680800676X . S2CID  30955392.
  15. ^ ab Leroy, Xavier. Algunos usos de Caml en la industria (PDF) . CUFP 2007 . Consultado el 26 de agosto de 2009 .
  16. ^ ab "Haskell en la industria". Wiki Haskell . Consultado el 26 de agosto de 2009 . Haskell tiene una amplia gama de usos comerciales, desde el sector aeroespacial y de defensa, hasta las finanzas, pasando por nuevas empresas web, empresas de diseño de hardware y fabricantes de cortadoras de césped.
  17. ^ abc Hudak, Paul ; Hughes, J.; Jones, SP; Wadler, P. (junio de 2007). Una historia de Haskell: ser vago con la clase. Tercer Congreso ACM SIGPLAN sobre Historia de los Lenguajes de Programación. San Diego, California. doi : 10.1145/1238844.1238856 . Consultado el 26 de septiembre de 2013 .
  18. ^ ab Mansell, Howard (2008). Finanzas cuantitativas en F#. CUFP 2008 . Consultado el 29 de agosto de 2009 .
  19. ^ ab Peake, Alex (2009). La primera aplicación importante de línea de negocio en F#. CUFP 2009. Archivado desde el original el 17 de octubre de 2009 . Consultado el 29 de agosto de 2009 .
  20. ^ comentarios, 27 de junio de 2017 Matt Banz Feed 603up 2. "Una introducción a la programación funcional en JavaScript". Opensource.com . Consultado el 9 de enero de 2021 .{{cite web}}: Mantenimiento CS1: nombres numéricos: lista de autores ( enlace )
  21. ^ "El calendario de conferencias useR! 2006 incluye artículos sobre el uso comercial de R". R-project.org. 2006-06-08 . Consultado el 20 de junio de 2011 .
  22. ^ Cámaras, John M. (1998). Programación con datos: una guía para el lenguaje S. Springer Verlag. págs. 67–70. ISBN 978-0-387-98503-9.
  23. ^ Novatchev, Dimitre. "El lenguaje de programación funcional XSLT: una prueba a través de ejemplos" . Consultado el 27 de mayo de 2006 .
  24. ^ Mertz, David. "Paradigmas de programación XML (cuarta parte): programación funcional enfocada al procesamiento XML". IBM DeveloperWorks . Consultado el 27 de mayo de 2006 .
  25. ^ Chamberlin, Donald D .; Boyce, Raymond F. (1974). "SECUELA: Un lenguaje de consulta estructurado en inglés". Actas del ACM SIGFIDET de 1974 : 249–264.
  26. ^ Programación funcional con C# - Simon Painter - NDC Oslo 2020, archivado desde el original el 30 de octubre de 2021 , consultado el 23 de octubre de 2021
  27. ^ ab "Programación funcional: lenguaje de programación Kotlin". Kotlin . Consultado el 1 de mayo de 2019 .
  28. ^ Dominus, Mark J. (2005). Perl de orden superior . Morgan Kaufman . ISBN 978-1-55860-701-9.
  29. ^ Holywell, Simón (2014). Programación funcional en PHP . php[arquitecto]. ISBN 9781940111056.
  30. ^ The Cain Gang Ltd. "Metaclases de Python: ¿Quién? ¿Por qué? ¿Cuándo?" (PDF) . Archivado desde el original (PDF) el 30 de mayo de 2009 . Consultado el 27 de junio de 2009 .
  31. ^ "GopherCon 2020: Dylan Meeus - Programación funcional con Go". YouTube .
  32. ^ "Características del lenguaje funcional: iteradores y cierres: el lenguaje de programación Rust". doc.rust-lang.org . Consultado el 9 de enero de 2021 .
  33. ^ Vanderbauwhede, Wim (18 de julio de 2020). "Código más limpio con programación funcional". Archivado desde el original el 28 de julio de 2020 . Consultado el 6 de octubre de 2020 .
  34. ^ "Escala efectiva". Wiki de Escala . Consultado el 21 de febrero de 2012 . Escala efectiva.
  35. ^ "Documentación del paquete java.util.function desde Java 8 (también conocido como Java 1.8)" . Consultado el 16 de junio de 2021 .
  36. ^ Turing, AM (1937). "Computabilidad y λ-definibilidad". La revista de lógica simbólica . Prensa de la Universidad de Cambridge. 2 (4): 153–163. doi :10.2307/2268280. JSTOR  2268280. S2CID  2317046.
  37. ^ Curry de Haskell Brooks; Robert Feys (1958). Lógica Combinatoria . Compañía editorial de Holanda Septentrional . Consultado el 10 de febrero de 2013 .
  38. ^ Iglesia, A. (1940). "Una formulación de la sencilla teoría de tipos". Revista de Lógica Simbólica . 5 (2): 56–68. doi :10.2307/2266170. JSTOR  2266170. S2CID  15889861.
  39. ^ McCarthy, John (junio de 1978). Historia de Lisp (PDF) . Historia de los lenguajes de programación . Los Ángeles, California. págs. 173–185. doi : 10.1145/800025.808387.
  40. ^ John McCarthy (1960). "Funciones recursivas de expresiones simbólicas y su cálculo por máquina, Parte I". (PDF) . Comunicaciones de la ACM . ACM Nueva York, Nueva York, Estados Unidos. 3 (4): 184-195. doi :10.1145/367177.367199. S2CID  1489409.
  41. ^ Guy L. Steele; Richard P. Gabriel (febrero de 1996). "La evolución de Lisp". Historia de los lenguajes de programación---II (PDF) . págs. 233–330. doi :10.1145/234286.1057818. ISBN 978-0-201-89502-5. S2CID  47047140.
  42. ^ Las memorias de Herbert A. Simon (1991), Models of My Life pp.189-190 ISBN 0-465-04640-1 afirma que él, Al Newell y Cliff Shaw son "... comúnmente considerados los padres del [campo] de la inteligencia artificial", por escribir Logic Theorist , un programa que demostró teoremas de Principia Mathematica automáticamente. Para lograr esto, tuvieron que inventar un lenguaje y un paradigma que, visto retrospectivamente, incorpore programación funcional. 
  43. ^ Landin, Peter J. (1964). "La evaluación mecánica de las expresiones". La revista informática . Sociedad Británica de Computación . 6 (4): 308–320. doi : 10.1093/comjnl/6.4.308 .
  44. ^ Diehl, Stephan; Hartel, Pieter; Sestoft, Peter (2000). "Máquinas abstractas para la implementación de lenguajes de programación". Sistemas informáticos de generación futura . vol. 16. págs. 739–751.
  45. ^ Landin, Peter J. (febrero de 1965a). "Correspondencia entre ALGOL 60 y la notación Lambda de Church: parte I". Comunicaciones de la ACM . Asociación para Maquinaria de Computación . 8 (2): 89-101. doi : 10.1145/363744.363749 . S2CID  6505810.
  46. ^ Landin, Peter J. (marzo de 1965b). "Una correspondencia entre ALGOL 60 y la notación Lambda de Church: parte II". Comunicaciones de la ACM . Asociación para Maquinaria de Computación . 8 (3): 158–165. doi : 10.1145/363791.363804 . S2CID  15781851.
  47. ^ Landin, Peter J. (marzo de 1966b). "Los próximos 700 lenguajes de programación". Comunicaciones de la ACM . Asociación para Maquinaria de Computación . 9 (3): 157–166. doi : 10.1145/365230.365257 . S2CID  13409665.
  48. ^ Backus, J. (1978). "¿Se puede liberar la programación del estilo von Neumann?: Un estilo funcional y su álgebra de programas". Comunicaciones de la ACM . 21 (8): 613–641. doi : 10.1145/359576.359579 .
  49. ^ RM Burstall. Consideraciones de diseño para un lenguaje de programación funcional. Trabajo invitado, Proc. Conf. del estado del arte de Infotech. "La revolución del software", Copenhague, 45–57 (1977)
  50. ^ RM Burstall y J. Darlington. Un sistema de transformación para desarrollar programas recursivos. Revista de la Asociación de Maquinaria de Computación 24(1):44–67 (1977)
  51. ^ RM Burstall, DB MacQueen y DT Sannella. ESPERANZA: un lenguaje aplicativo experimental. Proc. Conferencia LISP de 1980, Stanford, 136-143 (1980).
  52. ^ "¡Facilite el descubrimiento de asignar()!". OpenSCAD . Archivado desde el original el 19 de abril de 2023.
  53. ^ Peter Bright (13 de marzo de 2018). "A los desarrolladores les encantan los nuevos lenguajes de moda, pero ganan más con la programación funcional". Ars Técnica .
  54. ^ John Leonard (24 de enero de 2017). "El sigiloso ascenso de la programación funcional". Informática.
  55. ^ Leo Cheung (9 de mayo de 2017). "¿Es mejor la programación funcional para su startup?". InfoMundo .
  56. ^ Sean Tull - Categorías monoidales para análisis de conceptos formales.
  57. ^ Fuente, Dick. "La programación funcional alcanza la mayoría de edad". Byte (agosto de 1994) . Archivado desde el original el 27 de agosto de 2006 . Consultado el 31 de agosto de 2006 .
  58. ^ ab "ISO/IEC JTC 1/SC 22/WG5/N2137". Organización Internacional de Normalización. 6 de julio de 2017. {{cite journal}}: Citar diario requiere |journal=( ayuda )
  59. ^ "Informe revisado ^ 6 sobre el esquema de lenguaje algorítmico". R6rs.org . Consultado el 21 de marzo de 2013 .
  60. ^ "Informe revisado ^ 6 sobre el esquema de lenguaje algorítmico: justificación". R6rs.org . Consultado el 21 de marzo de 2013 .
  61. ^ Clinger, William (1998). "Adecuada recursividad de la cola y eficiencia espacial". Actas de la conferencia ACM SIGPLAN 1998 sobre diseño e implementación de lenguajes de programación - PLDI '98 . págs. 174-185. doi :10.1145/277650.277719. ISBN 0897919874. S2CID  16812984.
  62. ^ Panadero, Henry (1994). "Los CONS no deberían CONS sus argumentos, Parte II: Cheney sobre la MTA"
  63. ^ Turner, DA (28 de julio de 2004). "Programación funcional total". Revista de Informática Universal . 10 (7): 751–768. doi :10.3217/jucs-010-07-0751.
  64. ^ La implementación de lenguajes de programación funcionales. Simon Peyton Jones, publicado por Prentice Hall, 1987
  65. ^ ab John Launchbury (1993). "Una semántica natural para la evaluación perezosa": 144-154. CiteSeerX 10.1.1.35.2016 .  {{cite journal}}: Citar diario requiere |journal=( ayuda )
  66. ^ Robert W. Harper (2009). Fundamentos prácticos de los lenguajes de programación (PDF) . Archivado desde el original (PDF) el 7 de abril de 2016.
  67. ^ Huet, Gérard P. (1973). "La indecidibilidad de la unificación en la lógica de tercer orden". Información y Control . 22 (3): 257–267. doi :10.1016/s0019-9958(73)90301-x.
  68. ^ Huet, Gérard (septiembre de 1976). Resolución de ecuaciones en los idiomas de orden 1,2,... ω (Ph.D.) (en francés). Universidad de París VII.
  69. ^ Huet, Gerard (2002). "Unificación del Orden Superior 30 años después" (PDF) . En Carreño, V.; Muñoz, C.; Tahar, S. (eds.). Actas de la 15ª Conferencia Internacional TPHOL . LNCS. vol. 2410. Saltador. págs. 3–12.
  70. ^ Wells, JB (1993). "La tipificación y la verificación de tipos en el cálculo lambda de segundo orden son equivalentes e indecidibles". Tecnología. Representante 93-011 : 176–185. CiteSeerX 10.1.1.31.3590 . 
  71. ^ Leroy, Xavier (17 de septiembre de 2018). "El compilador verificado por Compcert".
  72. ^ Peyton Jones, Simón; Vytiniotis, Dimitrios; Weirich, Stephanie ; Geoffrey Washburn (abril de 2006). "Inferencia de tipos simple basada en unificación para GADT". CIFP 2006 : 50–61.
  73. ^ "Manual de OCaml". caml.inria.fr . Consultado el 8 de marzo de 2021 .
  74. ^ "Tipos de datos algebraicos". Documentación de Scala . Consultado el 8 de marzo de 2021 .
  75. ^ Kennedy, Andrés; Russo, Claudio (octubre de 2005). Tipos de datos algebraicos generalizados y programación orientada a objetos (PDF) . San Diego, California. ISBN 9781595930316. Archivado desde el original (PDF) el 29 de diciembre de 2006. {{cite book}}: fuente de cita |work=ignorada ( ayuda )Mantenimiento CS1: falta la ubicación del editor ( enlace )
  76. ^ Hughes, Juan. "Por qué es importante la programación funcional" (PDF) . Universidad Tecnológica de Chalmers .
  77. ^ Estructuras de datos puramente funcionales de Chris Okasaki , Cambridge University Press , 1998, ISBN 0-521-66350-4 
  78. ^ La naranja, Jean Niklas. "polymatheia - Comprensión del vector persistente de Clojure, parte 1". Polimateia . Consultado el 13 de noviembre de 2018 .
  79. ^ Michael Barr, Charles Well - Teoría de categorías para la informática.
  80. ^ Newbern, J. "Todo sobre las mónadas: una guía completa para la teoría y la práctica de la programación monádica en Haskell" . Consultado el 14 de febrero de 2008 .
  81. ^ "Trece formas de mirar una tortuga". fF# por diversión y ganancias . Consultado el 13 de noviembre de 2018 .
  82. ^ Paulson, Larry C. (28 de junio de 1996). ML para el programador de trabajo. Prensa de la Universidad de Cambridge. ISBN 978-0-521-56543-1. Consultado el 10 de febrero de 2013 .
  83. ^ Spiewak, Daniel (26 de agosto de 2008). "Implementación de vectores persistentes en Scala". Confirmación de código .
  84. ^ "¿Qué programas son más rápidos? | Juego de pruebas de lenguaje informático". benchmarksgame.alioth.debian.org. Archivado desde el original el 20 de mayo de 2013 . Consultado el 20 de junio de 2011 .
  85. ^ Ígor Pechtchanski; Vivek Sarkar (2005). "Especificación de inmutabilidad y sus aplicaciones". Concurrencia y Computación: Práctica y Experiencia . 17 (5–6): 639–662. doi :10.1002/cpe.853. S2CID  34527406.
  86. ^ "Capítulo 25. Elaboración de perfiles y optimización". Libro.realworldhaskell.org . Consultado el 20 de junio de 2011 .
  87. ^ Hartel, Pieter; Henk Müller; Hugh Glaser (marzo de 2004). "La experiencia Functional C" (PDF) . Revista de programación funcional . 14 (2): 129-135. doi :10.1017/S0956796803004817. S2CID  32346900.; David Mertz. "Programación funcional en Python, Parte 3". IBM DeveloperWorks . Archivado desde el original el 16 de octubre de 2007 . Consultado el 17 de septiembre de 2006 .(Parte 1, Parte 2)
  88. ^ "Funciones - Lenguaje de programación D 2.0". Marte digital. 30 de diciembre de 2012.
  89. ^ "Preguntas frecuentes no oficiales de Lua (uFAQ)".
  90. ^ "Funciones de primera clase en Go: el lenguaje de programación Go". golang.org . Consultado el 4 de enero de 2021 .
  91. ^ Eich, Brendan (3 de abril de 2008). "Popularidad".
  92. ^ van Rossum, Guido (21 de abril de 2009). "Orígenes de las características" funcionales "de Python" . Consultado el 27 de septiembre de 2012 .
  93. ^ "functools: funciones y operaciones de orden superior en objetos invocables". Fundación de software Python. 2011-07-31 . Consultado el 31 de julio de 2011 .
  94. ^ Skarsaune, Martín (2008). Proyecto SICS Java Port Traducción automática de un gran sistema orientado a objetos de Smalltalk a Java .
  95. ^ Gosling, James. "Cierres". James Gosling: en la carretera de Java . Oráculo. Archivado desde el original el 14 de abril de 2013 . Consultado el 11 de mayo de 2013 .
  96. ^ Williams, Michael (8 de abril de 2013). "Inicio rápido de Java SE 8 Lambda".
  97. ^ Bloch, Josué (2008). "Tema 15: Minimizar la mutabilidad". Java efectivo (Segunda ed.). Addison-Wesley. ISBN 978-0321356680.
  98. ^ "Object.freeze() - JavaScript | MDN". desarrollador.mozilla.org . Consultado el 4 de enero de 2021 . El método Object.freeze() congela un objeto. Un objeto congelado ya no se puede cambiar; congelar un objeto evita que se le agreguen nuevas propiedades, que se eliminen propiedades existentes, evita cambiar la enumerabilidad, configurabilidad o escritura de las propiedades existentes y evita que se cambien los valores de las propiedades existentes. Además, congelar un objeto también evita que se cambie su prototipo. congelar() devuelve el mismo objeto que se pasó.
  99. ^ Daniel Friedman; William Byrd; Oleg Kiselyov; Jason Hemann (2018). El intrigante razonado, segunda edición . La prensa del MIT.
  100. ^ A. Casas, D. Cabeza, MV Hermenegildo. Un enfoque sintáctico para combinar notación funcional, evaluación diferida y orden superior en sistemas LP. Octavo Simposio Internacional sobre Programación Lógica y Funcional (FLOPS'06), páginas 142-162, abril de 2006.
  101. ^ Despertar, David (2007). «Programación funcional en hoja de cálculo» (PDF) . Revista de programación funcional . 17 (1): 131-143. doi :10.1017/S0956796806006186. ISSN  0956-7968. S2CID  29429059.
  102. ^ Peyton Jones, Simón ; Burnett, Margarita ; Blackwell, Alan (marzo de 2003). "Mejora del lenguaje funcional más popular del mundo: funciones definidas por el usuario en Excel". Archivado desde el original el 16 de octubre de 2005.
  103. ^ Piro, Christopher (2009). Programación funcional en Facebook. CUFP 2009. Archivado desde el original el 17 de octubre de 2009 . Consultado el 29 de agosto de 2009 .
  104. ^ "Sim-Diasca: un motor de simulación concurrente de eventos discretos a gran escala en Erlang". Noviembre de 2011.
  105. ^ 1 millón es así 2011 Archivado el 19 de febrero de 2014 en Wayback Machine // Blog de WhatsApp, 6 de enero de 2012: "la última pieza importante de nuestra infraestructura es Erlang"
  106. ^ Momtahan, Lee (2009). Scala en EDF Trading: Implementación de un lenguaje específico de dominio para la fijación de precios de derivados con Scala. CUFP 2009. Archivado desde el original el 17 de octubre de 2009 . Consultado el 29 de agosto de 2009 .
  107. ^ Graham, Paul (2003). "Superando los promedios" . Consultado el 29 de agosto de 2009 .
  108. ^ Sims, Steve (2006). Creación de una startup con aprendizaje automático estándar (PDF) . CUFP 2006 . Consultado el 29 de agosto de 2009 .
  109. ^ Laurikari, Ville (2007). Programación Funcional en Seguridad de las Comunicaciones. CUFP 2007 . Consultado el 29 de agosto de 2009 .
  110. ^ Lorimer, RJ (19 de enero de 2009). "Anunciada la aplicación Clojure de producción en vivo". InfoQ .
  111. ^ "Programación funcional: 2019-2020". Departamento de Ciencias de la Computación de la Universidad de Oxford . Consultado el 28 de abril de 2020 .
  112. ^ "Programación I (Haskell)". Departamento de Computación del Imperial College de Londres . Consultado el 28 de abril de 2020 .
  113. ^ ab "Licenciatura en Ciencias de la Computación - Módulos" . Consultado el 28 de abril de 2020 .
  114. ^ ab Abelson, Hal ; Sussman, Gerald Jay (1985). "Prefacio a la segunda edición". Estructura e interpretación de programas informáticos (2 ed.). Prensa del MIT.
  115. ^ John DeNero (otoño de 2019). "Ciencias de la Computación 61A, Berkeley". Departamento de Ingeniería Eléctrica y Ciencias de la Computación, Berkeley . Consultado el 14 de agosto de 2020 .
  116. ^ Emmanuel Schanzer de Bootstrap entrevistado en el programa de televisión Triangulación de la cadena TWiT.tv

Otras lecturas

enlaces externos

Escuche este artículo ( 28 minutos )
Icono de Wikipedia hablado
Este archivo de audio se creó a partir de una revisión de este artículo con fecha del 25 de agosto de 2011 y no refleja ediciones posteriores. ( 25 de agosto de 2011 )
  1. ^ "Página de inicio de Greg Michaelson". Ciencias Matemáticas e Informática . Riccarton, Edimburgo: Universidad Heriot-Watt . Consultado el 6 de noviembre de 2022 .