En ciencies de la computación, la programación funcional ye un paradigma de programación declarativa basáu nel usu de funciones matemátiques, en contraste cola programación imperativa, que enfatiza los cambeos d'estáu por aciu la mutación de variables. La programación funcional tien los sos raigaños nel cálculo lambda, un sistema formal desenvueltu nos años 1930 pa investigar la definición de función, l'aplicación de les funciones y la recursión. Munchos llinguaxes de programación funcionales pueden ser vistos como ellaboraciones del cálculu lambda.

Na práutica, la diferencia ente una función matemática y la noción d'una "función" utilizada na programación imperativa, ye que les funciones imperatives pueden tener efeutos secundarios, como camudar el valor de cálculos realizaos primero. Por esta razón escarecen de tresparencia referencial, esto ye, la mesma espresión sintáctica puede resultar en valores distintos en dellos momentos de la execución del programa. Con códigu funcional, en contraste, el valor xeneráu por una función depende puramente de los argumentos alimentaos a la función. Al esaniciar los efeutos secundarios puede entendese y predicir el comportamientu d'un programa muncho más fácilmente. Ésta ye una de les principales motivaciones pa utilizar la programación funcional.

Los llinguaxes de programación funcional, especialmente los puramente funcionales, fueron enfatizados nel ambiente académico y non tantu nel desenvolvimientu comercial o industrial. Sicasí, llinguaxes de programación funcional como Scheme, Erlang, Rust, Objective Caml , Scala, F# y Haskell, fueron utilizaos n'aplicaciones comerciales ya industriales por munches organizaciones. La programación funcional tamién ye utilizada na industria al traviés de llinguaxes de dominiu específicu como R (estadística), Mathematica (matemátiques simbóliques), J y K (analís financieru).

Los llinguaxes d'usu específicu usaos comúnmente como SQL y Lex/Yacc, utilicen dellos elementos de programación funcional, especialmente al procesar valores mutables. Les fueyes de cálculu tamién pueden ser consideraes llinguaxes de programación funcional.

La programación funcional tamién puede ser desenvuelta en llinguaxes que nun tán diseñaos específicamente pa la programación funcional. Nel casu de Perl, por casu, que ye un llinguaxe de programación imperativu, esiste un llibru que describe como aplicar conceutos de programación funcional. JavaScript, unu de los llinguaxes más llargamente utilizaos na actualidá, tamién incorpora capacidaes de programación funcional. Python tamién incorpora particularidaes de los llinguaxes funcionales como llistes de comprensión y funciones de tratamientu de llistes como matemática de conxuntos. Java na so versión 8, ta incorporando la programación funcional, según l'usu de les espresiones lambda.

Utilidá L'oxetivu ye consiguir llinguaxes espresivos y matemáticamente elegantes, nos que nun sía necesariu baxar al nivel de la máquina pa describir el procesu lleváu a cabu pol programa, y evitar el conceutu de estáu del cómputu. La secuencia de computaciones llevaes a cabu pol programa ríxese única y puramente pola reescritura de definiciones más amplies a otres cada vez más concretes y definíes, usando lo que se denominen "definiciones empobinaes".

Carauterístiques Los programes escritos nun llinguaxe funcional tán constituyíos namái por definiciones de funciones, entendiendo éstes non como subprogramas clásicos d'un llinguaxe imperativu, sinón como funciones puramente matemátiques, nes que se verifiquen ciertes propiedaes como la tresparencia referencial (el significáu d'una espresión depende namái del significáu de los sos subexpresiones), y por tanto, la falta total de efeutos colaterales.

Otres carauterístiques propies d'estos llinguaxes son la non esistencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteración (lo qu'obliga na práutica a que toles repeticiones d'instrucciones llevar a cabu per mediu de funciones recursivas).

Esisten dos grandes categoríes de llinguaxes funcionales: los funcionales puros y los híbridos. La diferencia ente dambos finca en que los llinguaxes funcionales híbridos son menos dogmáticos que los puros, al almitir conceutos tomaos de los llinguaxes imperativos, como les secuencies d'instrucciones o la asignación de variables. En contraste, los llinguaxes funcionales puros tienen una mayor potencia espresiva, calteniendo al empar la so tresparencia referencial, daqué que nun se cumple siempres con un llinguaxe funcional híbridu.

Funciones de primer clase y d'orde cimeru

Funciones d'orde cimeru son funciones que pueden tomar otres funciones como argumentos o devolvelos como resultaos. En cálculu , un exemplu d'una función d'orde cimeru ye l'operador diferencial d / dx , que devuelve la derivada d'una función f .

Les funciones d'orde cimeru tán estrechamente rellacionaes coles funciones de primer clase nes cualos les funciones d'orde cimeru y les funciones de primer clase pueden recibir como argumentos y resultaos otres funciones. La distinción ente los dos ye sutil: "d'orde cimeru", describe un conceutu matemáticu de funciones qu'operen sobre otres funciones, ente que la "primer clase" ye un términu informáticu que describe les entidaes del llinguaxe de programación que nun tienen nenguna restricción del so usu (polo tanto funciones de primer clase pueden apaecer en cualesquier parte del programa qu'otres entidaes de primer nivel como los númberos pueden, incluyíos como argumentos a otres funciones y como los sos valores de torna).

Les funciones d'orde cimeru dexen l'aplicación parcial, una téunica na que s'aplica una función a los sos argumentos unu al empar, con cada aplicación devolver una nueva función qu'acepta'l siguiente argumentu. Esto déxa-y a unu espresar, por casu, la función socesor como l'operador de suma aplicada parcialmente al númberu natural unu.

Funciones pures Les funciones puramente funcionales (o espresiones) nun tienen efeutos secundarios (memoria o E/S). Esto significa que les funciones pures tienen delles propiedaes útiles, munches de les cuales pueden ser utilizaes pa optimizar el códigu:

Si nun s'utiliza el resultáu d'una espresión pura, puede esaniciase ensin afectar a otres espresiones.

Si una función pura llamar con parámetros que nun causen efeutos secundarios, el resultáu ye constante con al respeutive de la llista de parámetros (dacuando llamada tresparencia referencial), esto ye, si la función pura llamar de nuevu colos mesmos parámetros, el mesmu resultáu va ser devueltu (esto puede habilitar les optimizaciones d'almacenamientu en caxé).

Si nun hai una dependencia de datos ente dos expresión pures, entós el so orde puede ser invertíu, o pueden llevase a cabu en paralelu y que nun pueda interferir colos otros.

Si'l llinguaxe nun dexa efeutos secundarios, entós cualquier estratexa d'evaluación puede utilizase, lo que da la llibertá al compilador pa reordenar o combinar la evaluación d'espresiones nun programa (por casu, usando la fradadura).

La mayoría de los compiladores de llinguaxes imperativos detecten funciones pures automáticamente y realicen la eliminación de subexpresiones comunes. Sicasí non siempres ye posible detectalo en biblioteques pre-compiladas, porque por norma xeneral nun dan esta información. Esto provoca que nun se puedan realizar optimizaciones que podríen aplicar a diches funciones esternes. Dellos compiladores, como gcc, añaden pallabres claves adicionales por que'l programador marque explícitamente como pures aquelles funciones esternes que proceda, de cuenta que se-y apliquen les optimizaciones pertinentes. Fortran 95 tamién dexa declarar funciones "pures".

Recursividad

Iterar nos llinguaxes funcionales ye de normal lleváu a cabu por aciu recursividad. Les funciones recursivas invocar a sigo mesmes, dexando qu'una operación realícese una y otra vez hasta algamar el casu base. Anque delles recursividades requiern el caltenimientu d'una pila, la recursividad por aciu una cola puede ser reconocida y optimizada por aciu un compilador dientro del mesmu códigu utilizáu, pa implementar les iteraciones nun llinguaxe imperativu. L'estándar del esquema del llinguaxe requier implementaciones pa conocer y optimizar la recursividad por aciu una cola. La optimización de la recursividad por aciu una cola puede ser implementada tresformando'l programa a un estilu de pase de continuidá mientres la compilación, ente otros enfoques.

Los patrones comunes de recursividad puede ser factorizados usando funciones comunes más grandes, con “catamorfismos” y “anamorfismos” (plegues y esplegues), siendo estos los exemplos más evidentes. Tal que les mayores funciones más comunes tienen un rol análogu pa construyir estructures de control tiénense los iteradores nos llinguaxes imperativos.

La mayoría de los llinguaxes de programación funcional de propósitu xeneral dexen la recursividad ensin restricciones y superen el test de Turing, lo que fai que'l programa que s'ataya nun pueda tomar una decisión, lo que puede causar una falta de solidez nel razonamientu ecuacional y xeneralmente requier introducir inconsistencia dientro de la lóxica espresada polos tipos del sistema del llinguaxe. Dellos llinguaxes de propósitu especial como Coq dexen tan solo recursividad bien encontada y tienen una normalización fuerte(cálculos ensin rematar pueden ser espresaos tan solo con fluxos de valores infinitos llamaos codata) Arriendes d'ello, estos llinguaxes fallen el test de Turing y declarar funciones ciertes nellos ye imposible, pero pueden declarar una amplia clase de cálculos interesantes mientres eviten los problemes producíos pola recursividad ensin restricciones. La programación funcional llindada a la recursividad bien construyida con unes cuantes restricciones más se llama programación funcional total.

Evaluación estricta frente a la non estricta Los llinguaxes funcionales pueden ser clasificaos pol fechu d'usar evaluación estricta(eager) o non estricta(lazy), conceutos que faen referencia a cómo los argumentos de les funciones son procesaos cuando una espresión ta siendo evaluada. La diferencia téunica ta na notación semántica de les espresiones que contienen cálculos fallíos o diverxentes. So la evaluación estricta, la evaluación de cualquier términu que contenga un sub-términu fallíu va faer qu'esti sía de por sí fallíu.

Por casu, la espresión:

print length([2+1, 3*2, 1/0, 5-4])

va fallar so evaluación estricta pola división por cero nel tercer elementu de la llista. Utilizando evaluación non estricta, el tamañu de la función va devolver un valor de 4( por casu el númberu d'elementos de la llista) yá que evaluar esto nun va afectar al tar evaluando los que componen la llista. En resume, la evaluación estricta evalúa por completu los argumentos nun siendo que los sos valores rican evaluar la mesma función que se llama a sigo mesma.

La implementación de la estratexa común pa evaluación non estricta nos llinguaxes funcionales ye la d'amenorgamientu por aciu un grafo. La evaluación non estricta ye utilizada por defectu n'ensame de llinguaxes funcionales puros, incluyíos Miranda, Clean y Haskell.

Hughes (1984) defendía la evaluación non estricta como un mecanismu p'ameyorar la modularidad de los programes al traviés de la separación de xeres, a partir de la implementación de productores y consumidores de fluxos de datos de forma fácil ya independiente. Launchbury (1993) describe delles dificultaes que tenía la evaluación non estricta, particularmente al analizar los requisitos d'almacenamientu de los programes, y propón una semántica operacional p'ayudar mientres l'analís. Harper (2009) propón incluyir dambes téuniques (evaluación estricta y non estricta) nel mesmu llinguaxe, utilizando los tipos del sistema del llinguaxe pa estremales.

Sistemes de tipos