ventajas programación programacion orientada objetos industria funcional ejemplos desventajas functional-programming paradigms glossary

functional programming - programacion - Programación funcional y programación no funcional



programacion funcional vs orientada a objetos (9)

Qué es la programación funcional

Hay dos definiciones diferentes de "programación funcional" de uso común en la actualidad:

La definición anterior (originada de Lisp) es que la programación funcional se trata de programar utilizando funciones de primera clase, es decir, donde las funciones se tratan como cualquier otro valor para que pueda pasar funciones como argumentos a otras funciones y la función puede devolver funciones entre sus valores de retorno. Esto culmina con el uso de funciones de orden superior, como map y reduce (es posible que haya escuchado mapReduce de mapReduce como una operación única utilizada en gran medida por Google y, como era de esperar, ¡es un pariente cercano!). Los tipos .NET System.Func y System.Action hacen que las funciones de orden superior estén disponibles en C #. Aunque currar no es práctico en C #, las funciones que aceptan otras funciones como argumentos son comunes, por ejemplo, la función Parallel.For .

La definición más joven (popularizada por Haskell) es que la programación funcional también se trata de minimizar y controlar los efectos secundarios, incluida la mutación, es decir, escribir programas que resuelven problemas componiendo expresiones. Esto es más comúnmente llamado "programación puramente funcional". Esto es posible gracias a enfoques muy diferentes de estructuras de datos llamadas "estructuras de datos puramente funcionales". Un problema es que la traducción de algoritmos imperativos tradicionales para usar estructuras de datos puramente funcionales suele empeorar el rendimiento. Haskell es el único lenguaje de programación funcional superviviente, pero los conceptos se han infiltrado en la programación convencional con bibliotecas como Linq en .NET.

donde quisiera usarlo en lugar de la programación no funcional

En todos lados. Lambdas en C # ahora ha demostrado beneficios importantes. C ++ 11 tiene lambdas. No hay excusa para no usar funciones de orden superior ahora. Si puede utilizar un lenguaje como F #, también se beneficiará de la inferencia de tipos, la generalización automática, el currying y la aplicación parcial (¡y muchas otras características del lenguaje!).

¿Estoy en lo correcto al pensar que C es un lenguaje de programación no funcional?

Sí. C es un lenguaje de procedimiento. Sin embargo, puede obtener algunos de los beneficios de la programación funcional mediante el uso de indicadores de función y void * en C.

En mi segundo año de universidad, nos "enseñaron" Haskell, no sé casi nada al respecto y menos aún sobre programación funcional.

¿Qué es la programación funcional, por qué y / o dónde lo usaría en lugar de la programación no funcional y estoy en lo cierto al pensar que C es un lenguaje de programación no funcional?


El código de ejemplo de John the Statistician no muestra programación funcional, porque cuando estás haciendo programación funcional, la clave es que el código NO record = thingConstructor(t) ASIGNACIONES ( record = thingConstructor(t) es una asignación), y NO localMap.put(record) EFECTOS SECUNDARIOS ( localMap.put(record) es una declaración con un efecto secundario). Como resultado de estas dos restricciones, todo lo que hace una función se captura completamente por sus argumentos y su valor de retorno. Reescribiendo el código del Estadístico de la manera en que debería verse, si desea emular un lenguaje funcional usando C ++:

RT getOrCreate(const T thing, const Function<RT<T>> thingConstructor, const Map<T,RT<T>> localMap) { return localMap.contains(t) ? localMap.get(t) : localMap.put(t,thingConstructor(t)); }

Como resultado de la regla de no efectos secundarios, cada enunciado es parte del valor de retorno (por lo tanto, el return es lo primero ), y cada enunciado es una expresión. En los lenguajes que hacen cumplir la programación funcional, la palabra clave return es implícita, y la instrucción if se comporta como el operador ?: C ++ ?:

Además, todo es inmutable, por lo que localMap.put tiene que crear una nueva copia de localMap y devolverla, en lugar de modificar el mapa local original, como lo haría un programa normal de C ++ o Java. Dependiendo de la estructura de localMap, la copia podría volver a utilizar punteros en el original, reduciendo la cantidad de datos que se deben copiar.

Algunas de las ventajas de la programación funcional incluyen el hecho de que los programas funcionales son más cortos, y es más fácil modificar un programa funcional (porque no hay efectos globales ocultos para tener en cuenta), y es más fácil obtener el programa directamente en el primer lugar.

Sin embargo, los programas funcionales tienden a ejecutarse lentamente (debido a todas las copias que tienen que hacer), y no tienden a interactuar bien con otros programas, procesos del sistema operativo o sistemas operativos, que se ocupan de las direcciones de memoria, little-endian bloques de bytes y otros bits no funcionales específicos de la máquina. El grado de no interoperabilidad tiende a correlacionarse inversamente con el grado de pureza funcional y el rigor del sistema de tipos.

Los lenguajes funcionales más populares tienen sistemas de tipo muy, muy estrictos. En OCAML, ni siquiera puede mezclar números enteros y matemáticos de coma flotante, o usar los mismos operadores (+ es para agregar enteros, +. Es para agregar flotantes). Esto puede ser una ventaja o una desventaja, dependiendo de cuánto valora la capacidad de un verificador de tipos para detectar ciertos tipos de errores.

Los lenguajes funcionales también tienden a tener entornos de tiempo de ejecución realmente grandes. Haskell es una excepción (los ejecutables GHC son casi tan pequeños como los programas C, tanto en tiempo de compilación como en tiempo de ejecución), pero los programas SML, Common Lisp y Scheme siempre requieren toneladas de memoria.


En informática, la programación funcional es un paradigma de programación -un estilo de construcción de la estructura y elementos de los programas de computadora- que trata la computación como la evaluación de las funciones matemáticas y evita el estado colgante y los datos mutables . Es un paradigma de programación declarativa, lo que significa que la programación se realiza con expresiones. En el código funcional, el valor de salida de una función depende solo de los argumentos que se ingresan a la función, por lo que llamar a una función f dos veces con el mismo valor para un argumento x producirá el mismo resultado f (x) cada vez . La eliminación de los efectos secundarios, es decir, cambios en el estado que no dependen de las entradas de la función, puede hacer que sea mucho más fácil comprender y predecir el comportamiento de un programa, que es una de las motivaciones clave para el desarrollo de la programación funcional. ver para más detalles en wiki . algunos ejemplos de lagunas de programación funcional son como scala, javascript ... etc


Encuentro ¿Qué es la programación funcional? ser útil

La programación funcional se trata de escribir funciones puras, de eliminar entradas y salidas ocultas en la medida de lo posible, de modo que la mayor cantidad posible de nuestro código simplemente describa una relación entre las entradas y las salidas.

Prefiere explícito when param

public Program getProgramAt(TVGuide guide, int channel, Date when) { Schedule schedule = guide.getSchedule(channel); Program program = schedule.programAt(when); return program; }

encima

public Program getCurrentProgram(TVGuide guide, int channel) { Schedule schedule = guide.getSchedule(channel); Program current = schedule.programAt(new Date()); return current; }

Un lenguaje funcional es activamente hostil a los efectos secundarios. Los efectos secundarios son complejidad y complejidad, los errores y errores son el diablo. Un lenguaje funcional también te ayudará a ser hostil a los efectos secundarios.


Prefiero usar programación funcional para ahorrarme trabajo repetido, al hacer una versión más abstracta y luego usarla en su lugar. Déjame dar un ejemplo. En Java, a menudo me encuentro creando mapas para grabar estructuras y, por lo tanto, escribiendo estructuras getOrCreate.

SomeKindOfRecord<T> getOrCreate(T thing) { if(localMap.contains(t)) { return localMap.get(t); } SomeKindOfRecord<T> record = new SomeKindOfRecord<T>(t); localMap = localMap.put(t,record); return record; }

Esto sucede muy a menudo. Ahora, en un lenguaje funcional, podría escribir

RT<T> getOrCreate(T thing, Function<RT<T>> thingConstructor, Map<T,RT<T>> localMap) { if(localMap.contains(t)) { return localMap.get(t); } RT<T> record = thingConstructor(t); localMap = localMap.put(t,record); return record; }

y nunca más tendría que escribir una nueva, podría heredarla. Pero podría hacerlo mejor que heredar, podría decir en el constructor de esta cosa

getOrCreate = myLib.getOrCreate(*, SomeKindOfRecord<T>.constructor(<T>), localMap);

(donde * es una especie de notación "dejar este parámetro abierto", que es una especie de currying)

y luego el getOrCreate local es exactamente el mismo que hubiera sido si escribiera todo, en una línea, sin dependencias de herencia.


Puede valer la pena consultar este artículo en F # "101" en CoDe Mag recientemente publicado.

Además, Dustin Campbell tiene un gran blog en el que ha publicado muchos artículos sobre sus aventuras para ponerse al día con F #.

Espero que encuentres esto útil :)

EDITAR:

Además, solo para agregar, mi comprensión de la programación funcional es que todo es una función, o parámetros de una función, en lugar de instancias / objetos con estado. Pero podría estar equivocado. F # es algo que me muero de ganas por entrar pero no lo hago. ¡tener el tiempo! :)


Sí, tiene razón al pensar que C es un lenguaje no funcional. C es un lenguaje de procedimiento.


Si buscas un buen texto en F #

El experto F # es co-escrito por Don Syme. Creador de F #. Trabajó en genéricos en .NET específicamente para poder crear F #.

F # se modela después de OCaml, por lo que cualquier texto OCaml también te ayudará a aprender F #.


Una característica clave en un lenguaje funcional es el concepto de funciones de primera clase. La idea es que puede pasar funciones como parámetros a otras funciones y devolverlas como valores.

La programación funcional implica escribir código que no cambia de estado. La razón principal para hacerlo es para que las llamadas sucesivas a una función produzcan el mismo resultado. Puede escribir código funcional en cualquier idioma que admita funciones de primera clase, pero hay algunos idiomas, como Haskell, que no le permiten cambiar el estado. De hecho, no debes hacer ningún efecto secundario (como imprimir texto), lo que suena como que podría ser completamente inútil.

Haskell en cambio emplea un enfoque diferente para IO: mónadas. Estos son objetos que contienen la operación IO deseada para ser ejecutada por el nivel superior de su intérprete. En cualquier otro nivel, son simplemente objetos en el sistema.

¿Qué ventajas proporciona la programación funcional? La programación funcional permite la codificación con menos potenciales para los errores porque cada componente está completamente aislado. Además, el uso de recursividad y funciones de primera clase permite pruebas simples de corrección que típicamente reflejan la estructura del código.