¿Cuáles son los beneficios de la programación funcional? [cerrado]

95

¿Cuáles cree que son los beneficios de la programación funcional? ¿Y cómo se aplican a los programadores de hoy?

¿Cuáles son las mayores diferencias entre la programación funcional y la programación orientada a objetos?

Rayne
fuente
5
La paradoja de Blub. paulgraham.com/avg.html
missingfaktor

Respuestas:

75

El estilo de la programación funcional es describir lo que desea, en lugar de cómo obtenerlo. es decir: en lugar de crear un bucle for con una variable de iterador y marchar a través de una matriz haciendo algo en cada celda, diría que el equivalente de "esta etiqueta se refiere a una versión de esta matriz donde esta función se ha realizado en todos los elementos."

La programación funcional mueve ideas de programación más básicas al compilador, ideas como listas por comprensión y almacenamiento en caché.

El mayor beneficio de la programación funcional es la brevedad, porque el código puede ser más conciso. Un programa funcional no crea una variable iteradora para que sea el centro de un bucle, por lo que este y otros tipos de sobrecarga se eliminan de su código.

El otro beneficio importante es la concurrencia, que es más fácil de hacer con la programación funcional porque el compilador se ocupa de la mayoría de las operaciones que solían requerir la configuración manual de variables de estado (como el iterador en un bucle).

También se pueden ver algunos beneficios de rendimiento en el contexto de un solo procesador, dependiendo de la forma en que esté escrito el programa, porque la mayoría de los lenguajes y extensiones funcionales admiten la evaluación diferida. En Haskell puedes decir "esta etiqueta representa una matriz que contiene todos los números pares". Una matriz de este tipo es infinitamente grande, pero puede solicitar el elemento número 100.000 de esa matriz en cualquier momento sin tener que saber, en el momento de la inicialización de la matriz, cuál es el valor más grande que necesitará. El valor se calculará solo cuando lo necesite y no más.

Chris Wenham
fuente
12
Siento que su primer párrafo está más cerca de describir la programación relacional declarativa como Prolog que la programación funcional.
McPherrinM
6
@McPherrinM: los lenguajes funcionales son declarativos, en lugar de imperativos.
Lie Ryan
2
Parece que está confundiendo DP frente a IP, con procedimiento frente a FP . FP proporciona la separación de preocupaciones al enfatizar la composición de funciones, es decir, separando las dependencias entre los subcomputaciones de un cálculo determinista.
Shelby Moore III
2
@LieRyan incorrecto. Vea el enlace en mi comentario anterior
Shelby Moore III
La concurrencia consiste en tener varios subprocesos que pueden interactuar entre sí, lo cual es imperativo. Hacer múltiples cálculos independientes al mismo tiempo se llama paralelismo . Ver en.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy
29

El mayor beneficio es que no es lo que estás acostumbrado. Elija un lenguaje como Scheme y aprenda a resolver problemas con él, y se convertirá en un mejor programador en los idiomas que ya conoce. Es como aprender un segundo idioma humano. Asumes que los demás son básicamente una variación por tu cuenta porque no tienes nada con qué compararlos. La exposición a otros, en particular a aquellos que no están relacionados con lo que ya sabe, es instructiva.

Kirk Strauser
fuente
28
eso es un beneficio de aprenderlo, no un beneficio del paradigma en sí mismo
Moe
2
¿Pero están realmente separados? Desde el punto de vista del interrogador original, yo diría que no; lo más probable es que estén buscando beneficios en total gastando el esfuerzo para aprender un lenguaje funcional.
Kendall Helmstetter Gelner
3
"Eso es un beneficio de aprenderlo, no un beneficio del paradigma en sí". El paradigma se filtrará a su otro trabajo de programación orientada a objetos y puede ayudar a simplificar su desarrollo allí. Puede abordar los problemas desde "calcular esta salida a partir de esta entrada" y "componer estas dos funciones que calculan nuevos datos" en lugar de "esperar --- ¿cuál era el estado de alguna variable compartida allí?" y "¿Conseguí que estos procedimientos se ejecutaran en el orden correcto?". En serio, obtienes estos beneficios (al comprender el paradigma FP) en Python, C #, C ++, Java, lo que sea.
Jared Updike
11

Por qué es importante la programación funcional
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Resumen

A medida que el software se vuelve cada vez más complejo, es cada vez más importante estructurarlo bien. El software bien estructurado es fácil de escribir y depurar, y proporciona una colección de módulos que se pueden reutilizar para reducir los costos de programación futuros.

En este artículo mostramos que dos características de los lenguajes funcionales en particular, las funciones de orden superior y la evaluación perezosa, pueden contribuir significativamente a la modularidad. Como ejemplos, manipulamos listas y árboles, programamos varios algoritmos numéricos e implementamos la heurística alfa-beta (un algoritmo de Inteligencia Artificial utilizado en programas de juegos). Concluimos que dado que la modularidad es la clave para una programación exitosa, la programación funcional ofrece importantes ventajas para el desarrollo de software.

Robert Harvey
fuente
10

Por tanto, un buen punto de partida sería intentar comprender algunas cosas que no son posibles en lenguajes imperativos pero sí posibles en lenguajes funcionales.

Si está hablando de computabilidad, por supuesto, no hay nada que sea posible en la programación funcional pero no imperativa (o viceversa).

El objetivo de diferentes paradigmas de programación no es hacer posibles cosas que antes no eran posibles, sino facilitar las cosas que antes eran difíciles.

La programación funcional tiene como objetivo permitirle escribir más fácilmente programas que sean concisos, libres de errores y paralelizables.

sepp2k
fuente
5

No tiene por qué ser uno u otro: usar un lenguaje como C # 3.0 te permite mezclar los mejores elementos de cada uno. OO se puede utilizar para la estructura a gran escala a nivel de clase y superior, estilo funcional para la estructura a pequeña escala a nivel de método.

El uso del estilo funcional permite que se escriba código que declare su intención claramente, sin confundirse con declaraciones de flujo de control, etc. Debido a los principios como la programación libre de efectos secundarios, es mucho más fácil razonar sobre el código y verificar su corrección. .

Samuel Jack
fuente
5

Creo que el ejemplo más práctico de la necesidad de programación funcional es la concurrencia: los programas funcionales son naturalmente seguros para subprocesos y, dado el aumento del hardware de múltiples núcleos, esto es de suma importancia.

La programación funcional también aumenta la modularidad; a menudo puede ver métodos / funciones en imperativo que son demasiado largos; casi nunca verá una función de más de un par de líneas de largo. Y como todo está desacoplado, la reutilización ha mejorado mucho y la prueba unitaria es muy, muy sencilla.

Bozhidar Batsov
fuente
3

Una vez que el programa crece, el número de comandos en nuestro vocabulario se vuelve demasiado alto, lo que dificulta mucho su uso. Aquí es donde la programación orientada a objetos nos hace la vida más fácil, porque nos permite organizar mejor nuestros comandos. Podemos asociar todos los comandos que involucran al cliente con alguna entidad del cliente (una clase), lo que hace que la descripción sea mucho más clara. Sin embargo, el programa sigue siendo una secuencia de comandos que especifican cómo debe proceder.

La programación funcional proporciona una forma completamente diferente de ampliar el vocabulario. No se limita a agregar nuevos comandos primitivos; también podemos agregar nuevas estructuras de control, primitivas que especifican cómo podemos unir comandos para crear un programa. En lenguajes imperativos, pudimos componer comandos en una secuencia o usando un número limitado de construcciones integradas como bucles, pero si observa programas típicos, aún verá muchas estructuras recurrentes; formas comunes de combinar comandos

Soner Gönül
fuente
1

No piense en la programación funcional en términos de una "necesidad". En su lugar, piense en ello como otra técnica de programación que le abrirá la mente, ya que la programación orientada a objetos, las plantillas, el lenguaje ensamblador, etc. pueden haber cambiado completamente su forma de pensar cuando (si) los aprendió. En última instancia, aprender programación funcional lo convertirá en un mejor programador.

Justin Ethier
fuente
0

Si aún no conoce la programación funcional, aprenderla le brinda más formas de resolver problemas.

FP es una generalización simple que promueve funciones a valores de primera clase, mientras que OOP es para la estructuración de código a gran escala. Sin embargo, existe cierta superposición, donde los patrones de diseño de POO se pueden representar directamente y de manera mucho más sucinta utilizando funciones de primera clase.

Muchos lenguajes proporcionan FP y OOP, incluidos OCaml, C # 3.0 y F #.

Saludos, Jon Harrop.

JD
fuente