¿Por qué el entusiasmo actual por la programación funcional? [cerrado]

50

Últimamente he escuchado mucho entusiasmo sobre los lenguajes de programación funcionales, con respecto a Scala, Clojure y F #. Recientemente comencé a estudiar Haskell para aprender el paradigma FP.

Me encanta, es muy divertido y se adapta a mi experiencia matemática.

¿Pero realmente importará alguna vez? Obviamente, no es una idea nueva.

Aquí están mis preguntas:

  1. ¿Qué ha contribuido al reciente entusiasmo de FP? ¿Es simplemente aburrimiento con OO, o ha cambiado algo para hacer que FP sea más necesario que antes?
  2. ¿Es esto indicativo de un futuro FP? ¿O es una moda pasajera, como las bases de datos orientadas a objetos?

En otras palabras, ¿alguien puede ayudarme a entender de dónde viene esto y hacia dónde podría ir?

Eric Wilson
fuente
1
posible duplicado de la programación funcional vs. OOP
Amir Rezaei
13
No es un duplicado: esta pregunta es por qué las personas de repente están haciendo un escándalo, ya que no es una idea nueva (mientras que esa pregunta es pedir más diferencias objetivas).
Peter Boughton el
2
La gente está haciendo un escándalo por FP últimamente? Noticias para mí, pensé que este siempre era el caso de que algún grupo estaba haciendo un escándalo acerca de cómo FP se hará cargo del mundo de la programación imperativa.
Chris
1
Creo que he respondido esta pregunta en StackOverflow antes.
Ken Bloom
1
Sí, FP ya era viejo, creo que cuando estaba usando Scheme como estudiante en Columbia en 1989. Supongo que es algo nuevo y brillante.
Tim

Respuestas:

33

Una de las principales innovaciones en FP que ha resultado en la "explosión" de interés son las mónadas.

En enero de 1992, Philip Wadler escribió un artículo llamado La esencia de la programación funcional que introdujo a las mónadas en la programación funcional como una forma de tratar con IO.

El principal problema con los lenguajes de programación puros, perezosos y funcionales fue la utilidad al tratar con IO. Es uno de los miembros del "Awkward Squad" en programación, porque "la pereza y los efectos secundarios son, desde un punto de vista práctico, incompatibles. Si quieres usar un lenguaje perezoso, tiene que ser un lenguaje puramente funcional; si quieres usar efectos secundarios, es mejor que uses un lenguaje estricto ". Referencia

El problema con IO antes de las mónadas era que mantener la pureza no era posible para los programas que en realidad eran útiles para cualquier cosa. Por IO, nos referimos a todo lo relacionado con el cambio de estado, incluida la obtención de entradas y salidas del usuario o del entorno. En la programación funcional pura, todo es inmutable, para permitir pereza y pureza (sin efectos secundarios).

¿Cómo resuelven las mónadas el problema de IO? Bueno, sin discutir demasiado sobre las mónadas, básicamente toman el "Mundo" (el entorno de tiempo de ejecución) como entrada para la mónada, y producen un nuevo "Mundo" como salida, y el resultado: escriba IO a = Mundo -> (a, Mundo).

FP, por lo tanto, ha entrado cada vez más en la corriente principal, porque el mayor problema, IO (y otros) se ha resuelto. La integración en los lenguajes OO existentes también ha estado sucediendo, como saben. LINQ es mónadas, por ejemplo, de principio a fin.

Para obtener más información, recomiendo leer sobre mónadas y los documentos a los que se hace referencia en mi respuesta.

Richard Anthony Hein
fuente
Extremadamente informativo, gracias. Estoy aceptando esta respuesta, no porque sea correcta y otras estén equivocadas (he votado varias), sino porque creo que merece la visibilidad resultante.
Eric Wilson el
Sin embargo, type IO a = UI -> (a, UI)un ejemplo más relevante sería una respuesta fantástica.
ChaosPandion
@ Richard: "tipo IO a = Mundo -> (a, Mundo)" suena casi demasiado bueno para ser verdad (pensé que nunca obtendría mónadas). Supongo que comparas LINQ con las mónadas porque cuando pasas una lambda a un operador LINQ, la lambda "ve" todo su entorno, ¿no es así?
Stefan Monov
@Stefan: Suena un tanto preciso decir que la lambda ve su entorno, pero no estoy 100% claro al respecto, así que dudo en responder hasta que yo mismo aprenda más. Sin embargo, puedo decir con 100% de certeza que LINQ son mónadas, porque los creadores lo han dicho en muchas ocasiones. SelectMany es exactamente equivalente a Bind en Haskell. Si no ha leído "The Marvels of Monads " ( blogs.msdn.com/b/wesdyer/archive/2008/01/11/… ) Lo recomiendo encarecidamente ... revelará cómo LINQ es realmente mónadas. Salud.
Richard Anthony Hein
1
@ Job, consulte blogs.msdn.com/b/wesdyer/archive/2008/01/11/… como se menciona en el comentario anterior.
Richard Anthony Hein
30

Uno de los principales problemas al programar lenguajes tradicionales como C, Java, C #, ensamblador, etc. es que tiene una secuencia incómoda de pasos que debe seguir para realizar una tarea dada porque primero debe haber preparado todas las dependencias y SUS dependencias anteriores

Un ejemplo: para hacer A, debe tener presentes B y C, y B depende de D y E, lo que da como resultado algo así como

  • re
  • mi
  • C
  • si
  • UNA

porque debes tener los ingredientes preparados antes de poder usarlos.

Los lenguajes funcionales, especialmente los flojos, dan vuelta este. Al dejar que A diga que necesita B y C, y dejar que el tiempo de ejecución del lenguaje descubra cuándo obtener B y C (lo que a su vez requiere D y E), todos los cuales se evalúan cuando es necesario para evaluar A, puede crear muy pequeño y conciso bloques de construcción, que resultan en programas pequeños y concisos. Los lenguajes perezosos también permiten usar listas infinitas, ya que solo se calculan los elementos realmente utilizados, y sin necesidad de almacenar toda la estructura de datos en la memoria antes de poder usarla.

El truco realmente bueno es que este mecanismo automático de "oh, necesito una B y una C" es escalable porque no hay restricción, como en el programa secuencial, sobre dónde y cuándo puede ocurrir esta evaluación, por lo que puede suceder en el momento mismo tiempo e incluso en diferentes procesadores o computadoras.

Es por eso que los lenguajes funcionales son interesantes, porque el mecanismo de tiempo de ejecución asume el mecanismo "qué hacer cuando" en lugar de que el programador tenga que hacerlo manualmente. Esta es una diferencia tan importante como la recolección de basura automática fue para Java a C, y una de las principales razones por las que es más fácil escribir software robusto y escalable de subprocesos múltiples en Java que en C. Es aún más fácil escribir robusto, software escalable multiproceso en lenguajes funcionales ...


fuente
3
Esto era cierto en 1950, por supuesto.
Eric Wilson el
1
@FarmBoy, no realmente, pero lo es hoy.
55
¿Cómo difiere esto de la inyección de dependencia?
Bill K
2
@ Bill K, excelente observación: yo no había hecho esa conexión. La diferencia es que los objetos a inyectar, al menos en Java, se evalúan con entusiasmo y no se evalúan de manera perezosa. No puede inyectar una lista infinita.
1
@ Thorbjørn Ravn Andersen No estoy muy seguro de entender por qué una lista infinita sería útil, ¿puedes hacer una suma de operaciones de tipo (lista infinita)? Parece muy improbable. De lo contrario, suena como la forma en que Java usa iteradores, solo codifica el iterador de tal manera que solo crea instancias de los objetos cuando los solicita, no del todo infinito, pero nunca termina (hay una GRAN diferencia, ¿eh? )
Bill K
21

A finales de los años 80 / principios de los 90, las computadoras se volvieron lo suficientemente potentes para la POO de estilo Smalltalk. Hoy en día las computadoras son lo suficientemente potentes para FP. FP está programando en un nivel superior y, por lo tanto, a menudo, aunque es más agradable de programar, no es la forma más eficiente de resolver un determinado problema. Pero las computadoras son tan rápidas que no te importa.

La programación multinúcleo puede ser más fácil con lenguajes de programación puramente funcionales, ya que se ve obligado a aislar el código que cambia de estado.

También los bordes del lenguaje de programación están borrosos hoy. No tiene que renunciar a un paradigma si quiere usar otro. Puede hacer FP en los idiomas más populares, por lo que la barrera de entrada es baja.

LennyProgrammers
fuente
66
Iba a agregar una respuesta, pero llegaste a mi punto en tu última oración; La programación funcional será cada vez más frecuente a medida que aumente el número de núcleos en una sola máquina. La falta de estado inherente hace que sea más fácil dividir mecánicamente programas funcionales entre procesadores (lo que significa que si tiene un programa puramente funcional, un compilador teóricamente puede encargarse del paralelismo por usted con un mínimo esfuerzo de su parte, ¿puede ver youtube.com/watch? v = NWSZ4c9yqW8 para una discusión del paralelismo de datos).
Inaimathi el
1
@Inaimathi Ditto. La programación funcional es muy escalable, por lo que tiene sentido en arquitecturas multinúcleo.
EricBoersma
Tenga en cuenta que mi primer comentario fue escrito antes de que la respuesta fuera editada para contener una declaración adicional.
Inaimathi
Lo siento por eso. Acabo de olvidar este punto.
LennyProgrammers
¿Se acepta generalmente que los compiladores funcionales no pueden producir código de máquina tan optimizado como un OOPS? No puedo pensar en ninguna razón teórica por la que eso deba ser cierto; y puedo pensar en formas en que son posibles optimizaciones más avanzadas que en un OOPS.
Jeremy
7

Necesidad actual de computación distribuida.

FP utiliza funciones como bloques de construcción, que no tienen estado, por lo que invocarlas n veces con los mismos parámetros debería devolver siempre el mismo valor, no tienen efectos secundarios.

Por lo tanto, puede enviar la misma función a un montón de máquinas para realizar y hacer el trabajo en paralelo.

En el paradigma OO, esto es un poco más difícil, porque los bloques de construcción son objetos, que son casi por definición con estado. Si invoca varias veces el mismo método, debe tener cuidado al sincronizar los datos internos, para evitar la corrupción de datos. Aunque todavía es posible, el paradigma FP funciona mejor que el OO en algunos escenarios en los que se debe distribuir la computación.

El advenimiento de FP (y NoSQL en cierta medida) se produce después de las historias sobre sorprendentes resultados informáticos en cientos de miles de computadoras que trabajan en paralelo, y lo fácil que es.

Pero probablemente este sea solo un nicho del tipo de aplicaciones que necesitan este tipo de configuración. Para muchas, muchas otras aplicaciones / sistemas, los procedimientos y OO funcionan bien.

Por lo tanto, se trata de expandir nuestros horizontes de programación y retomar estos conceptos que alguna vez pensamos que no irían más allá de la academia.

Aprendí a programar en Lisp hace años, y en aquel entonces no sabía que eso era FP. Por ahora me he olvidado de casi todo al respecto, pero ciertamente me ayuda a comprender conceptos como la recursión muy fácilmente.

OscarRyz
fuente
2
La pregunta es acerca de las ventajas de los lenguajes tipo FP . Lo que describió también se puede hacer usando los idiomas tradicionales.
Pacerier
6

Nos estamos moviendo a una era en la que el procesamiento multinúcleo no es solo algo que se hace en los cuartos traseros de los laboratorios de ciencias o en hardware especializado. Ahora se está haciendo con procesadores de productos básicos. La programación funcional, al menos la mayoría de las variantes a las que he estado expuesto, generalmente intenta impulsar una vista sobre unidades computacionales sin estado y sin efectos secundarios. Este es el paradigma por excelencia para el trabajo multinúcleo, ya que no es necesario mantener el estado mezclado entre los procesadores.

Esta es solo una de las razones, pero es una muy buena razón para ver cómo se afianza la programación funcional.

Wheaties
fuente
5

Creo que la respuesta principal a esa pregunta es 'exposición'.

La programación funcional no es nada nuevo, me enseñaron a Haskell en la universidad hace unos 12 años y me encantó. Pero raramente uso el lenguaje en mi trabajo profesional.

Recientemente ha habido una serie de idiomas que están ganando terreno en la corriente principal que utilizan un enfoque de paradigmas múltiples; F # , JavaScript siendo ejemplos principales.

JavaScript en particular, especialmente cuando se usa con un lenguaje de marco de estilo funcional como jQuery o Prototype , se está convirtiendo en un lenguaje cotidiano para muchas personas debido a todo el trabajo en sitios web modernos y dinámicos. Esta exposición al estilo funcional hace que las personas se den cuenta del poder que otorga, especialmente cuando uno puede volver a un estilo imperativo a voluntad.

Una vez que las personas están expuestas, prueban variantes más completas de lenguajes funcionales y comienzan a usarlas para las tareas cotidianas.

Con F # convirtiéndose en un lenguaje de primera clase en Visual Studio 2010 y jQuery (et al) cada vez más importante, se está volviendo realista usar estos lenguajes, en lugar de algo oscuro para jugar o hacer programas aislados.

Recuerde que el código debe ser mantenible: una masa crítica de desarrolladores debe usar y admitir idiomas para que las empresas se sientan seguras al usarlos.

Orbling
fuente
3

En esta charla, Anders Hejlsberg explica su punto de vista sobre el tema.

[EDITAR]

Lo sentimos, el enlace estaba mal. Ahora apunta al lugar correcto.

Resumen extremadamente breve de algunos puntos de la charla de una hora:

Los lenguajes funcionales permiten un estilo de programación más declarativo que los lenguajes de procedimiento, por lo que los programas escritos en FL generalmente se concentran más en el qué en lugar del cómo . Debido a su elegante estructura matemática, los FL también son más fáciles de optimizar y transformar mediante compiladores, lo que también permite una fácil metaprogramación y la construcción de DSL integrados. Todo esto en conjunto hace que los programas funcionales sean más concisos y autodocumentados que los programas de procedimientos.

Además, en vista de la era de muchos núcleos del futuro cercano, los lenguajes de programación deben ser capaces de utilizar múltiples procesos / subprocesos de diferentes maneras. El subprocesamiento múltiple en máquinas de un solo núcleo era en efecto un mecanismo de tiempo compartido, y la arquitectura de los sistemas lo reflejaba. El subprocesamiento múltiple en máquinas de muchos puntos será muy diferente. Los lenguajes funcionales son especialmente adecuados para la paralelización, ya que en su mayoría evitan el estado, por lo que no es necesario preocuparse tanto por la integridad de los datos mutables compartidos (porque no suele haber datos mutables compartidos).

Pillmuncher
fuente
1
¿Podría resumir?
1
@Thorbjorn Eso me recuerda al hombre que no pudo resumir . (No te dirijo eso, responde al autor.)
Mark C
1
El enlace ni siquiera enlaza al lugar correcto.
Ken Bloom
2

Creo que tiene que ver con la estrecha correlación entre el paradigma de programación funcional y la programación para la web.

Ruby on Rails puso en relieve todo el enfoque de la programación funcional, ya que ofrecía un camino muy rápido hacia una aplicación web funcional (heh heh). Hay una discusión interesante sobre SO sobre esto, y una respuesta particular se destaca:

La programación funcional coincide muy bien con las aplicaciones web. La aplicación web recibe una solicitud HTTP y produce un resultado HTML. Esto podría considerarse una función desde las solicitudes hasta las páginas.

Compare con las aplicaciones de escritorio, donde generalmente tenemos un proceso de larga ejecución, una interfaz de usuario con estado y flujo de datos en varias direcciones. Esto es más adecuado para OO que se preocupa por los objetos con estado y paso de mensajes.

Dado que la programación funcional ha existido durante siglos, me pregunto por qué no veo muchos anuncios de trabajo en busca de desarrolladores de Lisp para proyectos web nuevos.

Gary Rowe
fuente
Creo que la analogía funcional se aplica a la web solo de manera incidental, ya que el protocolo subyacente no tiene estado. Las aplicaciones web no son realmente apátridas, lo que de hecho es una razón por la que siempre tenemos que trabajar alrededor de HTTP de alguna manera.
Mladen Jablanović
@Mladen Hmmm, ¿es posible que esté combinando el estado de comunicación cliente-servidor (HTTP) con el estado de la aplicación (DAO, etc.)? Citando a Stefan Tilkov desde aquí ( codemonkeyism.com/stateless-applications-illusion ) "En una aplicación web, cada solicitud individual debe contener suficiente información para poder procesarse independientemente de si se produjo o no una solicitud previa. Recurso persistente del lado del servidor el estado está bien, el estado del lado del cliente está bien, el estado de comunicación transitoria (sesión) no es porque arruinará la escalabilidad y la posibilidad de marcar ". Esta es la base de REST.
Gary Rowe
1
es posible que desee leer paulgraham.com/avg.html para comprender mejor por qué no hay muchos anuncios de empleo en busca de desarrolladores de Lisp.
@ Thorbjørn Ravn Andersen Buen artículo. Me inspira a sacar mi editor Lisp.
Gary Rowe
1

La programación funcional me da la misma sensación de hormigueo de " wow, esto es nuevo " que cuando comencé a incursionar en objetos hace años.

Me doy cuenta de que FP no es un concepto nuevo con diferencia, pero tampoco lo era OO cuando tuvo su verdadero descanso en los noventa cuando "todos" saltaron repentinamente de la programación de procedimientos. Esto se debió en gran medida al éxito oportuno de Java y luego de C #.

Me imagino que lo mismo sucederá con FP eventualmente una vez que el próximo lote de idiomas comience a extenderse de la misma manera. Como ya lo han hecho, al menos en algunos círculos, con idiomas como Scala y F #.

Martin Wickman
fuente
OO es mucho más joven que FP, pero se convirtió en el centro de atención mucho antes. Supongo que el paréntesis asustó demasiado a la gente
Javier
1

Aquí están mis preguntas: 1. ¿Qué ha contribuido al reciente entusiasmo de FP? ¿Es simplemente aburrimiento con OO, o ha cambiado algo para hacer que FP sea más necesario que antes? 2. ¿Es esto indicativo de un futuro FP? ¿O es una moda pasajera, como las bases de datos orientadas a objetos?

Otros han dado buenas razones técnicas.

Creo que la razón principal por la que FP está ganando terreno entre los tipos promedio de desarrolladores y administradores es su promesa de permitir un mejor uso de las CPU de múltiples núcleos. De todo lo que he leído, FP permite una programación paralela más fácil (no fácil).

Su futuro uso generalizado será si la promesa es real y se cumple.

ElGringoGrande
fuente
Ese es un gran "si". COBOL, estar "en inglés" significaría que cualquiera podría programar. AI iba a hacer que la programación fuera obsoleta. OO iba a hacer que la programación fuera tan simple como ensamblar juegos de hojalata. Los codificadores son como grupos de rock, siempre buscando la "próxima gran cosa", y la que
sigue
0

Creo que es una combinación de dos tendencias:

  1. Características funcionales que se agregan a los lenguajes principales (por ejemplo, C #).
  2. Se crean nuevos lenguajes funcionales.

Probablemente haya un límite natural en la primera tendencia, pero supongo que cualquier lenguaje nuevo tendrá que soportar la programación funcional, al menos como una opción, para ser tomado en serio.

Larry Coleman
fuente
0

Solía ​​ser que las personas escribían programas para ejecutarse en el escritorio utilizando las API nativas del sistema operativo, y esas API estaban (generalmente) escritas en C, por lo que en su mayor parte si desea escribir un programa para las API nativas, usted escribió ese programa en C.

Creo que la nueva innovación en los últimos 10 años más o menos es que una diversidad de API se ponga al día, particularmente para cosas como el desarrollo web donde las API de la plataforma son irrelevantes (ya que construir una página web básicamente implica la manipulación de cadenas). Como no está codificando directamente a la API Win32 o la API POSIX, eso le da a las personas la libertad de probar lenguajes funcionales.

Ken Bloom
fuente
0

Es elegante e ingenioso y le hace cosquillas en el cerebro. Esta bien.

También es, en mi humilde opinión, un carro clásico. Una solución buscando un problema.

Es como todas las empresas de nueva creación fundadas por ingenieros que deslumbraron con una idea favorita, que arden brillantemente por un tiempo, pero son superadas silenciosamente por empresas fundadas en proporcionar lo que se necesita.

Esa es la nueva idea que me gustaría ver despegar, programación basada en necesidades, no programación basada en ideas ingeniosas. Tal vez eso suene mundano, pero creo que de hecho puede ser bastante creativo e ingenioso.

Mike Dunlavey
fuente
-1

Definitivamente debido a F #, aunque a veces es difícil saber cuál es la causa y cuál es el efecto.

tia
fuente