2010-07-23 22 views
10

Duplicar posibles:
Why functional languages?Beneficios y usos de un lenguaje de programación funcional

que comenzó a programar con C/C++, VB, y, finalmente, Python - todos los lenguajes imperativos. Tomé un curso sobre lenguajes de programación y aprendí mi primer lenguaje funcional: OCaml. Fue terrible.

Sintaxis y otros horrores aparte, OCaml tomó mi proceso de pensamiento imperativo y lo tiró por la ventana. Fue frustrante Insistí en que todo lo que podría hacerse funcionalmente también podría hacerse imperativamente. Pensé en la programación funcional como una programación imperativa sin una extremidad (efectos secundarios). En respuesta a mi frustración, el único beneficio que mi profesor pudo encontrar fue la capacidad de un FPL para paralelizar las funciones libres de efectos secundarios.

De todos modos, suficiente charla.

  1. ¿Cuáles son algunas de las ventajas que ofrecen los FPL por encima de las IPL?
  2. ¿Hay algo que se pueda hacer fácilmente en un FPL que no se puede hacer fácilmente en una IPL?
  3. ¿Hay algún ejemplo del mundo real de FPL en uso, o en su mayoría sirven como ejercicios académicos? (Cuando digo mundo real, me refiero a un proyecto que depende en gran medida del aspecto funcional del lenguaje y no introduce un FPL en un escenario al que no pertenece).

Gracias,
Advait

+2

Parcialmente duplicar: http://stackoverflow.com/questions/36504/ why-functional-languages ​​ –

+1

Solo una breve sugerencia: un idioma de OO 'le impide' acceder a todas las variables, escondiéndolas detrás de las abstracciones. Esto te ayuda a controlar la complejidad. Del mismo modo, un FP le impide manipular el estado compartido y, por lo tanto, le ayuda a escribir código paralelizable, entre otras cosas. –

+0

Vi esa publicación y noté cómo todos mencionaron el paralelismo fácil. No estaba realmente satisfecho con ninguna de las respuestas. Siento que la paralelización de llamadas a funciones estándar no proporcionará muchos beneficios de rendimiento sobre permitir al programador paralelizar explícitamente su propio código (especialmente dado que la sobrecarga de iniciar un nuevo hilo para ejecutar una función potencialmente trivial es bastante grande). Cuando el programador deja la elección (cuándo/a qué paralelizar), obtiene la mayor libertad: los beneficios de rendimiento del paralelismo sin las muletas de un FPL. – advait

Respuesta

14

En primer lugar, casi todos los idiomas de uso común hoy en día es equivalente en potencia expresiva, ya sea imperativo o funcional, por lo que es natural pensar que nada se puede hacer en una lenguaje funcional que probablemente puedas hacer en un imperativo, porque probablemente sea cierto.

Una de las cosas realmente agradables de los lenguajes funcionales es que su estructura permite la aplicación de la inferencia de tipo Hindley-Milner. Este es el tipo de sistema utilizado en SML, OCaml y muchos otros lenguajes funcionales. Realmente parece conducir a tasas reducidas de errores y es capaz de ahorrarle mucho tiempo y energía al encontrar errores por adelantado como errores de compilación.

El argumento de paralelización automática es un poco sobreutilizado, especialmente porque la promesa simplemente no se ha producido. He escrito código explícitamente paralelo en lenguajes funcionales y es más agradable, en mi humilde opinión, que hacer algo similar en Java o similar.

Como anécdota, al menos, no sería la primera persona en afirmar que aprender un lenguaje funcional te convierte en un mejor programador imprescindible. Esa incomodidad que sintió al interrumpir su proceso de pensamiento "imperativo" al usar OCaml es en realidad un proceso muy bueno para atravesar. Te hace cuestionar las suposiciones y te impide escribir código de una manera particular simplemente porque siempre lo has hecho de esa manera.

En cuanto al uso en el mundo real, es posible que desee consultar los procedimientos de los talleres Commercial Users of Functional Programming. También hay algunos proyectos muy grandes escritos en varios lenguajes funcionales, aunque la mayoría de ellos probablemente tengan un interés limitado fuera de comunidades bastante pequeñas. Los probadores de teoremas Coq e Isabelle están escritos en Ocaml y SML, respectivamente.

Hagas lo que hagas, perseveraré.Pasé mucho tiempo golpeando mi cabeza contra ML antes de que las cosas finalmente hicieran clic. En estos días no estoy seguro de recordar siquiera cómo funciona Java o C, porque no los he necesitado en mucho tiempo ... ¡Solo uso ML!

+0

Específicamente, este video sobre los usos de la programación funcional en Facebook es realmente interesante y convincente: http://cufp.org/videos/functional-programming-facebook – Gian

+0

El "poder expresivo" no te compra tanto. Puede remar en un bote alrededor del mundo o usar un barco. Ambos tienen el "poder expresivo" para llevarte por el mundo. La mayoría de las personas no toman el bote de remos. –

+0

@Rainer, no estoy seguro si estuvo de acuerdo conmigo o no, pero ese fue básicamente el punto que estaba haciendo. Es trivialmente cierto que puedes implementar la mayoría de las cosas en cualquier lenguaje razonable, es solo si quieres o no lo que importa. – Gian

7
  1. Cuando uno finalmente logra silenciar su mente imperativamente (mal) entrenada, FP en realidad se vuelve más fácil y más divertido que IP.

  2. FP tiende a ser más seguro, menos propenso a errores, debido a su naturaleza declarativa.

  3. Me gusta pensar que el código imperativo de paralelismo duplica su complejidad (pruébate con una aplicación paralela no trivial). IMO, FP reduce mucho la brecha, gracias a la falta de sincronización en muchos casos.

  4. Citando Gian, el aprendizaje de FP que hacer una sabia programador imprescindible ...

+3

No hay mucha información real sobre el punto 2. Es principalmente una expectativa. Si miras las computadoras en las aeronaves, pueden usar Ada, que es un lenguaje típicamente imperativo. La cantidad comparable de código escrito en un lenguaje FP (OCAML, Haskell, ...) que realmente se ejecuta en una computadora de vuelo es probablemente cercano a cero. El único lugar donde se utilizan los lenguajes de PF es en la verificación de programas imperativos, sin embargo, el código FP no se está ejecutando en una computadora de vuelo. Pueden ser excepciones, pero casi todos los códigos seguros del mundo real no se encuentran en uno de estos idiomas que espera que sean más seguros o menos propensos a errores. –

+0

Sí, es cierto que la mayoría de las pruebas del punto 2 son anecdóticas, ¡pero hay mucha evidencia anecdótica! Y para ser justos, no hay mucha información sólida acerca de las técnicas para mejorar la calidad del software en cualquier idioma. – Gian

+1

Existe una gran cantidad de literatura sobre cómo escribir sistemas seguros para aeronaves y sistemas similares. Si el software de FP es más seguro o menos defectuoso, ¿por qué no se usa ampliamente en software de misión crítica (que no sea para la verificación)? ¿Se verifican los sistemas de tiempo de ejecución de estos idiomas? –

Cuestiones relacionadas