Diferencia entre revisiones de «Programación funcional»

Contenido eliminado Contenido añadido
Etiquetas: Edición desde móvil Edición vía web móvil
Jimmy Olano (discusión · contribs.)
m Corrección de errores ortográficos.
Línea 3:
En [[ciencias de la computación]], la '''programación funcional''' es un [[paradigma de programación]] [[Programación declarativa|declarativa]] basado en el uso de [[Función matemática|funciones matemáticas]], en contraste con la [[programación imperativa]], que enfatiza los cambios de estado mediante la mutación de variables.<ref>{{cita web |url = https://medium.com/elblogdejavascript/programación-funcional-5da872a080fe/ |título = Programación Funcional |fechaacceso = 1 de abril de 2018 |apellido = López |nombre = José |fecha = 21 de julio de 2017 |sitioweb = Medium Com |idioma = castellano |cita = La Programación Funcional es un paradigma de programación, un estilo de construir la estructura y elementos de programas de computadores, que trata los cálculos como la evaluación de funciones matemáticas y evita el cambio de estado y mutar la estructura de datos, se puede decir que también es un Paradigma de Programación Declarativa ya que depende de las expresiones o declaraciones en vez de estados. |formato = html |urlarchivo = https://archive.today/20180401153232/https://medium.com/elblogdejavascript/programaci%C3%B3n-funcional-5da872a080fe |fechaarchivo = 1 de abril de 2018 }}</ref> La programación funcional tiene sus raíces en el [[cálculo lambda]], un sistema formal desarrollado en los años 1930 para investigar la definición de función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación funcionales pueden ser vistos como elaboraciones del cálculo lambda.
 
En la práctica, la diferencia entre una función matemática y la noción de una "función" utilizada en la programación imperativa, es que las funciones imperativas pueden tener efectos secundarios, como cambiar el valor de cálculos realizados previamente. Por esta razón, carecen de transparencia referencial; es decir, la misma expresión sintáctica puede resultar en valores diferentes en varios momentos de la ejecución del programa. Con código funcional, en contraste, el valor generado por una función depende exclusivamente de los argumentos alimentados a la función. Al eliminar los efectos secundarios se puede entender y predecir el comportamiento de un programa mucho más fácilmente. ÉstaEsta es una de las principales motivaciones para utilizar la programación funcional.
 
Los lenguajes de programación funcional, especialmente los puramente funcionales, han sido enfatizados en el ambiente académico y no tanto en el desarrollo comercial o industrial. Sin embargo, lenguajes de programación funcional como [[Scheme]], [[Erlang]], [[Rust (lenguaje de programación)|Rust]], [[Objective CAML|Objective Caml]], [[Lenguaje de programación Scala|Scala]], [[F Sharp|F#]] y [[Haskell]], han sido utilizados en aplicaciones comerciales e industriales por muchas organizaciones. La programación funcional también es utilizada en la industria a través de lenguajes de dominio específico como R (estadística), Mathematica (matemáticas simbólicas), J y K (análisis financiero).
Línea 15:
 
== Características ==
Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstasestas no como subprogramas clásicos de un lenguaje imperativo, sino como funciones puramente matemáticas, en las que se verifican ciertas propiedades como la ''[[transparencia referencial]]'' (el significado de una expresión depende únicamente del significado de sus subexpresiones), y por tanto, la carencia total de ''[[Efecto secundario (computación)|efectos colaterales]]''.
 
Otras características propias de estos lenguajes son la no existencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteración (lo que obliga en la práctica a que todas las repeticiones de instrucciones se lleven a cabo por medio de [[recursión|funciones recursivas]]).
Línea 50:
Los patrones comunes de recursividad pueden ser factorizados usando funciones comunes más grandes, con “catamorfismos” y “anamorfismos” (pliegues y despliegues), siendo estos los ejemplos más evidentes. Tal y como las mayores funciones más comunes tienen un rol análogo para construir estructuras de control se tienen los iteradores en los lenguajes imperativos.
 
La mayoría de los lenguajes de programación funcional de propósito general permiten la recursividad sin restricciones y superan el test de Turing, lo que hace que el programa que se interrumpe no pueda tomar una decisión, lo que puede causar una falta de solidez en el razonamiento ecuacional y generalmente requiere introducir inconsistencia dentro de la lógica expresada por los tipos del sistema del lenguaje. Algunos lenguajes de propósito especial como Coq permiten tan sólosolo recursividad bien fundamentada y tienen una normalización fuerte(cálculos no finalizados pueden ser expresados tan sólosolo con flujos de valores infinitos llamados codata) En consecuencia, estos lenguajes fallan el test de Turing y declarar funciones ciertas en ellos es imposible, pero pueden declarar una amplia clase de cálculos interesantes mientras evitan los problemas producidos por la recursividad sin restricciones. La programación funcional limitada a la recursividad bien construida con unas cuantas restricciones más se llama programación funcional total.
 
=== Evaluación estricta frente a la no estricta ===
Línea 75:
 
=== La 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. Por ejemplo, tanto [[D (lenguaje de programación)|D]] y [[Fortran]]95 se apoyan explícitamente en funciones puras. [[Funciones de primera clase]], se han añadido lentamente a los lenguajes principales. Por ejemplo, a principios de 1994, el apoyo a lambda, filtro, mapa, y reducir esta en [[Python]]. Luego, durante el desarrollo de [[Python]] 3000, [[Guido van Rossum]] pidió la eliminación de estas características. Sin embargo, más tarde cambió de opinión, y sólosolo la reducción fue eliminado, a pesar de que sigue siendo accesible a través de los módulos de biblioteca [[functools]] estándar. Funciones de primera clase también fueron introducidas en [[PHP]] 5.3, [[Visual Basic]]9, [[C#]]3.0 y [[C]]++11.
 
En Java, las clases anónimas a veces pueden ser utilizados para simular [[Clausura_(informática)|clausuras]]. Sin embargo, las clases anónimas no son siempre los reemplazos completos de las clausuras, ya que tienen capacidades más limitadas. Por ejemplo, Java 8, incluye [[expresiones lambda]] para reemplazar determinadas clases anónimas. Sin embargo, la presencia de excepciones con comprobaciones en este lenguaje puede desaconsejar el uso de programación funcional, ya que puede ser necesario para capturar las excepciones que se deben controlar para después volverlas a lanzar ellos (problema este que sin embargo no se produce en otros lenguajes sobre [[JVM]] que no tienen excepciones comprobadas, como es [[Scala (lenguaje de programación)|Scala]]).