¿Cuáles son los mejores lenguajes para entrar en la programación funcional y por qué? Estoy buscando un lenguaje con sintaxis clara, participación activa de la comunidad y buena documentación.

Haskell es hermoso y te enseñará a pensar sobre la programación de una manera nueva. OCaml es útil con sus bibliotecas y comunidad saludable de usuarios. F # es como OCaml, pero puedes ejecutarlo en .NET. Scala es una transición fácil para aquellos familiarizados con Java y la programación orientada a objetos. Pero si desea aprender lo básico de la programación funcional, Scheme es sin duda el mejor.

La programación funcional se caracteriza por programas que se parecen más a funciones matemáticas que a procedimientos que mantienen y actualizan el estado. En lugar de actualizar los valores existentes, los programas funcionales producen nuevos valores como funciones de los valores antiguos. En los lenguajes de programación funcionales, tiene funciones de primera clase (funciones que se pueden pasar como cualquier otro valor) y funciones de orden superior (funciones que toman otras funciones como argumentos). Los modismos clave en la programación funcional incluyen el curry (aplicación parcial de funciones) y el uso de mapas , filtros y reducciones de construcciones para interactuar con estructuras de datos. Los lenguajes funcionales modernos, como Haskell y la familia ML, tienen sofisticados sistemas de tipo estático que nos permiten razonar acerca de los programas antes de ejecutarlos, pero los tipos no son fundamentales para la programación funcional y pueden confundir al programador funcional novato.

La programación funcional se reduce a una idea clave: usted hace todo con funciones . Ningún otro lenguaje destila este concepto como lo hace Scheme. Diseñado basado en Lisp para enseñar a los estudiantes a programar, Scheme es un lenguaje simple y muerto basado en dos principios:

  1. Cada expresión es un átomo o una lista.
  2. Evalúa una lista aplicando el primer elemento de la lista al resto de los argumentos.

Debido a su simplicidad, Scheme proporciona un entorno fantástico para acostumbrarse a manipular valores de una manera funcional. Después de aprender Scheme, estará bien equipado para reconocer y utilizar patrones funcionales en lenguajes más complejos. (Tenga en cuenta que la mayoría de los lenguajes funcionales, incluido el Esquema, admiten funciones que no son puramente funcionales , por ejemplo, la actualización de valores. Estas funciones permiten una mayor eficiencia del programa, y ​​en ocasiones de la programación, pero recomiendo aprender a programar en un estilo totalmente funcional. antes de usar estos atajos.)

Un libro de texto fantástico para comenzar con Scheme es Estructura e interpretación de programas de computadora. Un libro tan fantástico sobre programación y pensamiento computacional. He vuelto y lo he leído años más tarde por diversión.

Además, si quieres ser un poco más moderno y jugar con la vanguardia de la investigación de Scheme, consulta The Racket Language. Todo tipo de herramienta y lenguaje divertido allí.

Nota. Supongo que está leyendo esta respuesta porque ya sabe por qué quiere aprender programación funcional. Si no, aquí hay algunas razones.

  1. Debido a su relativa concisión y simplicidad, los programas funcionales tienden a ser más fáciles de razonar que los imperativos.
  2. Los lenguajes de programación funcional son elegantes y lo ayudarán a convertirse en un mejor programador en todos los idiomas.
  3. “Los programadores más inteligentes que conozco son programadores funcionales”. – uno de mis profesores de pregrado

SML . Tiene una sintaxis limpia y no sacrifica la simplicidad por lo práctico. Probablemente no querrá desarrollar un producto real utilizando SML debido a su relativa falta de extensiones y comunidad, pero es útil aprender los conceptos en un lenguaje más académico antes de sumergirse en una implementación real.

En CMU, la programación funcional se introduce a través de SML. La programación en Standard ML es un gran recurso para aprender sobre SML y la programación funcional en general ( http://www.cs.cmu.edu/~rwh/smlbook/ ).

A diferencia de SML, Scala y Clojure en algunos casos intercambian simplicidad (y seguridad de tipos) para la interoperabilidad con Java. Por ejemplo, los objetos en Scala pueden ser nulos. En Scala, también es fácil terminar escribiendo un código que es básicamente imperativo, por lo que también lo evitaría para aprender la programación funcional por esa razón.

OCaml es similar a SML pero tiene varias peculiaridades de sintaxis molestas (“;;”, “rec”, “+.”) Y una complejidad innecesaria (objetos) que puede frustrar a los principiantes.

Depende de su motivo subyacente para aprender programación funcional.

Si se trata de ampliar su horizonte como ingeniero y, posteriormente, buscar una adopción y apoyo indoloros, las respuestas que he leído en defensa de Haskell, SML y Erlang son válidas.

Sin embargo, si su motivo subyacente es aumentar sus posibilidades de empleo en el futuro, yo diría que los idiomas de PF basados ​​en JVM, como Clojure o Scala, son una mejor opción.

Por ejemplo, los empleos de Scala han aumentado dramáticamente en los últimos años con grandes organizaciones que previamente invirtieron en Java, adoptando Scala. La lógica para elegir Scala y no, por ejemplo, Haskell, Lisp o Erlang, es porque está basada en la JVM. Esto hace que Scala sea “el demonio que ellos conocen” y más fácil de aprender para los desarrolladores de Java ampliamente disponibles.

En esta coyuntura, un comando fuerte de Scala no es un requisito previo para realizar un trabajo como ingeniero de Scala. Sin embargo, he notado que los requisitos de Scala son cada vez más detallados en los últimos 6-12 meses; con un conocimiento profundo de las API de Scala, incluidas las colecciones, así como las características de rendimiento de los lenguajes comunes de Scala, las macros de Scala y / o los complementos del compilador ahora son un requisito previo para algunos roles.

Si bien esto puede no ser una pregunta difícil en esta etapa, espero que los requisitos se vuelvan muy detallados en unos pocos años. Como tal, ensuciarse las manos ahora será una buena opción para usted.

Realmente hay demasiados idiomas para ejecutarse, así que me concentraré en los más populares, ¡o al menos en los que parecen ser los más populares para ingresar a FP!

Scala y Clojure
No es un lenguaje funcional “puro”, pero se están presentando cada vez más roles de Scala, por lo que es una buena cosa que aprender, especialmente para los desarrolladores jóvenes.
Se considera una empresa sin riesgo en FP porque se ejecuta en la JVM y en las bibliotecas de Java y se puede usar directamente en el código Scala (y viceversa), lo que probablemente significa que se usará aún más en el futuro. Aprender Scala podría ser un buen movimiento de carrera, si nada más.
Debido a que se ejecuta en la JVM, se ve como una transición más fácil a FP cuando se compara con otros lenguajes ‘más puros’ como Haskell (ver más abajo). Como probablemente no hay un programador que no esté familiarizado con la POO, puedes aprender de manera gradual porque ya tienes una buena base para empezar.

Haskell
Haskell es considerado como un lenguaje funcional “puro” y se lo tiene en alta estima. Sin embargo, esto puede ser un poco como una espada doble para las personas que no han estado demasiado expuestas al PF en el pasado.
Los lenguajes ‘puros’ pueden estar fuera de lo común para las personas que no han tenido experiencia en el pasado porque se les presentan todos los conceptos nuevos al mismo tiempo.
Se considera bastante matemático, así que si esto es algo que no te interesa, puede ser un poco desagradable.
Un poco más complicado en comparación con otros idiomas, y realmente, si está buscando entrar en FP con una buena introducción directa, probablemente podría elegir un lenguaje más agradable para hacerlo.
Pero, es ‘puro’, ya que lo obtendrás, ¿por qué no saltar allí y aprender todo de una vez? Haskell demuestra por qué la PF en su conjunto es fantástica: su productividad aumentará y escribirá un código más claro y más fácil de mantener.

Esquema
Esquema es una buena introducción para FP. Tradicionalmente, estaba bien integrado en el mundo académico, por lo que hay muchos materiales de enseñanza que se centran en Scheme.
Una gran cosa sobre Scheme que la gente sigue apareciendo es que está libre de anotaciones de tipo innecesarias. Tiene un núcleo pequeño y la sintaxis es fácil de aprender, de esta manera usted puede sentirse cómodo con FP sin tener que pensar y aprender sobre un montón de cosas al mismo tiempo. Puede acostumbrarse a manipular valores dentro de un contexto de PF, puede comenzar a reconocerlos y hacer que la transición a PF sea mucho más suave. Con todo, una gran introducción en FP.

Por supuesto, como mencioné, hay muchos idiomas para elegir, pero creo que Scala, Clojure, Haskell y Scheme son probablemente los principales para usar como introducción a FP. Algunos otros lenguajes notables incluyen: Lisp: hace que la inmutabilidad sea opcional, lo que a veces puede significar que las cosas se descomponen o no se dan cuenta de todo su potencial. OCaml: buena comunidad de usuarios saludables, de nuevo, no es un lenguaje ‘puro’, es Object-Functional, por lo que puede ser un poco más fácil de aprender. F # – Se puede ejecutar en .Net. La raqueta ligeramente desviada de la especificación de Scheme, un poco como Clojure pero no se ejecuta en la JVM. Buen lenguaje práctico para aprender, pero no sería la opción obvia para ingresar a FP.

La Programación Funcional requerirá que pienses un poco diferente, pero esto no es necesariamente algo malo. Esto lo convertirá en un mejor programador, así que elija un lenguaje que se adapte a usted donde pueda sumergirse sin problemas en lugar de saltar al final.

Si lo haces con el propósito de aprender , acércate a Haskell. Lleva el paradigma a su conclusión lógica.

Encontré a Haskell muy frustrante al principio. Creo que mi error fue pasar demasiado tiempo escribiendo código. Conseguí más como un novato por leer el buen Haskell que por escribir mi propio mal Haskell; las entradas de blog escritas por ingenieros de Galois Inc. a menudo son esclarecedoras: http://www.galois.com/blog/

Cuando se establece un código de escritura, encontrará que hay muchos errores de compilación, y todos son errores tipográficos. Esto también es frustrante, al principio, hasta que tenga la “Experiencia Haskell”: que una vez que su programa compila, funciona. Solo … funciona. Claro, podrías haber revertido los operandos a la división en algún lugar, pero esos son los tipos de errores que quedan; no más errores de la forma, “Oh, tienes que intercalar llamadas a snark.foo () entre llamadas a blark.openFooWindow () y blark.closeFooWindow (), pero solo anidan una profunda, y ya hemos abierto el ventana a veces aquí, así que … “. Desafía mis ideas preconcebidas sobre de dónde provienen los errores y cuánto pueden ayudar las herramientas automatizadas; por ejemplo, los ataques de inyección de SQL son errores de compilación en programas de Haskell razonables, porque las cadenas de entrada del usuario son de un tipo diferente a las consultas de SQL.

Todavía soy un oficial en Haskell, pero me sorprende que se encuentre a la vez entre los idiomas más concisos, bellos y de alto rendimiento. Muestra que son posibles grandes mejoras en la notación de software.

Common Lisp es la que me enamoró de la programación. Sin embargo, fue hace casi 2 décadas 🙂

Por el momento, recomiendo a Haskell que aprenda el primer lenguaje de programación (no solo el primer lenguaje de programación funcional). Enseño a los estudiantes de secundaria a codificar en Haskell (como su primer lenguaje de programación) para resolver problemas de matemáticas / física, y pueden aprender fácilmente los conceptos básicos en menos de una semana y ya han resuelto problemas complejos (problemas de tipo Projecteuler). La pureza, la pereza y el sistema de tipos de Haskell son tres cosas más importantes que hacen que Haskell sea un lenguaje muy bueno para obligarlo a pensar “funcionalmente”.

Sin embargo, por motivos prácticos (desarrollo de aplicaciones web, desarrollo de aplicaciones móviles y análisis de datos) recomiendo encarecidamente Clojure. El lenguaje está muy bien diseñado, es considerablemente rico en funciones de vanguardia y la biblioteca está creciendo rápidamente. Con Clojure me siento cómodo haciendo cosas difíciles que involucran la concurrencia / paralelismo debido a sus estructuras de datos inmutables y modelos de administración de estado. Como una ventaja adicional, hay Clojurescript para hacer cualquier cosa que Javascript podría hacer (no solo para el navegador, sino también para la orientación de Node o phonegap). Aunque no es tan puro como Haskell, Clojure es probablemente el segundo FPL convencional más puro que existe, y la forma en que aísla los efectos secundarios de la OMI lo hace “seguro” y “útil” al mismo tiempo.

Creo que mucho de lo que determina el mejor idioma depende de dónde vienes. Si usted es un programador nuevo sin la mayor influencia de un paradigma específico, Scheme es el único lenguaje que le dará la mejor introducción a la programación funcional. Las razones son:

  1. El esquema tiene un núcleo pequeño, sintaxis fácil de aprender, complejidad accidental mínima
  2. Recolección de basura que no te obliga a sumergirte en las complejidades innecesarias de la asignación de memoria y la desasignación en tus pensamientos de programación.
  3. mecanografiado dinámicamente, que de nuevo lo hace libre de muchas anotaciones de tipo innecesarias, lo que simplifica el proceso de aprendizaje
  4. Lee Eval Print Loop que facilita la codificación en vivo
  5. Una introducción muy suave a la programación funcional.
  6. Presencia de muchas implementaciones de calidad.

Ok … Haskell es posiblemente una de las formas más puras de lenguaje de programación funcional. Pero Haskell también es muy intimidante en el sentido de que la mayoría de los modismos de Haskell provienen directamente del mundo de las matemáticas. Esto puede ser un deporte de botín a menos que esté matemáticamente inclinado o familiarizado con la teoría.

Pero si eres de un fondo de programación orientada a objetos, puedes comenzar desde Scala o Clojure que tiene algunos elementos de conceptos OO en ellos. Scala es un objeto funcional y realmente puede pasar de OO a funcional de manera gradual. Clojure se basa en la JVM y una gran parte de Clojure se escribe en Java. Aunque como programador siempre se le recomienda utilizar los lenguajes funcionales del lenguaje. En pocas palabras, si viene con la influencia de algún paradigma específico, es mejor que elija un idioma que le brinde pequeños pasos para migrar su proceso de pensamiento.

Comience con el esquema. Escribo Haskell 14 horas por día, pero creo que Scheme es el mejor lugar para comenzar.

Dependiendo de dónde vienes, es probable que Haskell introduzca un montón de conceptos a la vez, lo que hace que sea difícil dominarlos todos. Scheme es un buen lugar para sentirse cómodo con la programación de orden superior sin tener que pensar en clases de tipos, mónadas y anotaciones de rigor. Además, el mejor libro de texto de programación de intro utiliza Scheme y está disponible en línea: http://htdp.org/ . Si usted es un programador experimentado, puede parecer elemental al principio, pero le resultará interesante si se mantiene firme.

Después de eso, vaya a aprender Standard ML u OCaml para el sistema de módulos y Haskell para la pureza. ¡Y divertirse!

Me gustaría cabildear por Haskell. Sé que hay algunas preocupaciones sobre su idiosincrasia y comunidad, pero al menos pruébelo primero. Si no es necesario, entonces considera otros idiomas (saltaría a Clojure, luego a Scheme). Sin embargo, si se dirige a Haskell, creo que encontrará una introducción impactante al estilo funcional.

Desde mi breve inmersión en la programación funcional, he visto un par de tradiciones. Existe la tradición Lisp que celebra el papel de la función de primera clase, con suerte con una implementación de cierre decente. Lisp también hace cosas realmente sorprendentes con su sintaxis homoicónica, pero creo que la homoiconicidad no es fundamental para el estilo funcional. Yo sí, sin embargo, siento que la inmutabilidad es fundamental. Sin embargo, Lisp solo aboga débilmente por la inmutabilidad (por lo que es opcional), y por lo tanto no puede darse cuenta del potencial completo de un sistema de referencia transparente. Y por la naturaleza dinámica de Lisp, ignora completamente la posibilidad de probar invariantes programáticos con la ayuda de tipos.

Al conocer bien a Haskell, no se pierde ninguna de las defensas de la tradición Lisp con respecto al estilo funcional; Las funciones de primera clase son fundamentales. Pero se basa en una tradición más nueva de programación funcional que promueve la transparencia referencial con la esperanza de no solo afirmar más fácilmente la corrección, sino también beneficiarse de una evaluación perezosa. Además, el sistema de tipos de Haskell es bastante avanzado, lo que tiene algunos beneficios para razonar acerca de un algoritmo.

Haskell viene con muchos dogmas, pero este dogma es ideal para aprender el estilo funcional. Es fácil de programar con efectos secundarios en un Lisp; es como la programación imperativa tradicional, pero con esa forma de prefijado de Lisp-y. Pero hacer un montón de programación de efectos secundarios en Haskell puede llegar a ser realmente feo. La eliminación de los algoritmos de efectos secundarios de Haskell puede generar enormes ganancias en la limpieza. Pero esto es genial para aprender. En algunos otros idiomas, el estilo funcional puede verse peor que el estilo imperativo. Pero en Haskell, el estilo funcional es a menudo extremadamente compacto y expresivo en relación con la alternativa imperativa.

Para comenzar, el tutorial de Haskell de Learn You A ( http://learnyouahaskell.com/ ) es la mejor introducción que he encontrado hasta la fecha, aunque escucho la programación de Graham Hutton en el libro de Haskell ( http: //www.cs.nott .ac.uk / ~ gmh / bo …) también es bastante bueno.

Clojure. Intenté durante años entrar en un lenguaje funcional, y este fue el que finalmente pude mantener el tiempo suficiente para obtener algo de tracción. Atribuyo esto a la interoperabilidad JVM y a la comunidad, pero aquí están mis razones para ti:

  • Es un lisp, así que no hay sintaxis que aprender.
  • Compila a código JVM nativo, para que tenga una interoperabilidad completa de Java. Puedes decir “eww” aquí, y yo también lo hice, pero confía en mí, es fantástico poder recurrir a una biblioteca de Java cuando te quedas atascado en Lisp, y recuerda, hay bibliotecas de Java para * todo *, y aunque Es posible que no sean los DSL de aspecto más impecable con los que están saliendo los Rubyists, tienen razón y son muy rápidos.
  • Macros Las macros son dulces, y no las obtendrás en un ML o Haskell. (al parecer hay camlp4 y haskell de plantilla, sobre los cuales solo sé que algunos blogs dicen que te dan un poder tipo LISP, por lo que quizás este punto no sea válido)
  • Gran comunidad y documentación. Los documentos son muy claros y fáciles de buscar (hay básicamente una página que mantengo abierta todo el tiempo, y no necesito nada más), y el canal IRC generalmente está zumbando, si no está zumbando.

Lo único que extrañarás de aprender Clojure es la teoría de tipos. He tenido la intención de probar Scala por esta razón.

Haskell. No veo un punto aprendiendo ningún otro lenguaje de programación (funcional). Todas las construcciones de programación funcional se han implementado en Haskell únicamente; Una manera mejor que en cualquier lenguaje funcional mixto. Haskell también tiene un sistema de construcción Cabal que es simplemente increíble.

Haskell es realmente muy simple. Su sintaxis es limpia y solo tiene unas pocas palabras clave. Debido a que es 100% funcional, no tiene código hinchado que mezcle diferentes paradigmas. El código es fácil de razonar y probablemente nunca tengas errores extraños. Haskell también compila a código nativo por lo que es muy rápido, y puede llamar fácilmente a las funciones implementadas en C (a través de FFI).

Si está buscando “sintaxis clara, participación activa de la comunidad, buena documentación”, sugeriría probar un poco de Elixir también. El esquema es definitivamente bueno para comenzar, pero Elixir sería mejor para escribir aplicaciones web, etc.
1. Casi como Ruby (muy agradable / sintaxis fácil).
2. Utiliza Erlang VM exactamente como Clojure usa JVM. Se puede utilizar para escribir programas en paralelo / multinúcleo fácilmente. También puede utilizar las famosas bibliotecas OTP de Erlang.
3. Muy útil (y comunidad activa).
4. Uno puede escribir prototipos en Elixir y luego escalar las cosas en él.

Si el objetivo es aprender programación funcional, con énfasis en aprendizaje y programación funcional: Esquema (lenguaje de programación) (renombrado) con “Little Schemer” y SICP – Estructura e interpretación de programas de computadora (libro).

Los lenguajes de la familia ML y Haskell introducen muchos conceptos fascinantes (coincidencia de patrones, tipos, módulos, clases de tipos, etc.) y vale la pena aprenderlos, pero en general estos conceptos son ortogonales a la programación funcional en sí.

Estoy de acuerdo con las principales respuestas a esta pregunta hasta ahora, pero se ha omitido un lenguaje muy importante; Elixir.

Elixir es un lenguaje funcional creado por José Valim, miembro del equipo central de Rails.

Aquí está la descripción de https://www.elixir-lang.org

Elixir es un lenguaje dinámico y funcional diseñado para crear aplicaciones escalables y mantenibles.

Elixir aprovecha la máquina virtual de Erlang, conocida por ejecutar sistemas de baja latencia, distribuidos y tolerantes a fallas, mientras que también se usa con éxito en el desarrollo web y el dominio de software integrado.

Una aplicación notable que fue construida usando Erlang es WhatsApp. WhatsApp tiene varios millones de usuarios y pudo atender a estos usuarios a través de una sola pieza de hardware. https://www.erlang-solutions.com

El elixir se está volviendo muy popular, muy rápido. Ya tiene un gran número de seguidores en la comunidad de Ruby on Rails, y personalmente creo que la demanda de los desarrolladores de Elixir aumentará considerablemente en los próximos años.

La idea más importante en FP es, como señaló Jean, ‘ haces todo con funciones ‘. En otras palabras, la función es el ciudadano de primera clase. Una vez que comprenda este mensaje, habrá aprendido la esencia de la PF. De acuerdo con la mayor declaración de Jean: este lenguaje debe ser simple; Las páginas de PF como Haskell son demasiado poderosas para que los principiantes se atasquen de alguna manera y no vean la belleza de la PF, por lo que esta lengua debe ser lo suficientemente simple.

Sin embargo, simple no significa primitivo. La sintaxis de Scheme es fácil de analizar por PC, pero no para humanos. Bienvenidos a la moderna reencarnación de Scheme, CoffeeScript. Aquí hay una sugerencia concreta para los principiantes de FP: siga el libro SICP usando CoffeeScript; Termina todos los ejercicios utilizando CS.

Si desea profundizar en la teoría de la FP y experimentar la belleza de la FP, Haskell es el mejor lenguaje. Hay muchos libros, un canal de IRC activo y excelentes listas de correo.

Si desea sumergir su dedo pequeño en las aguas de la FP, Scala y OCaml (o F #) ofrecen una manera más suave de acercarse a la FP. Scala es más OO y OCaml tiene más sabor a ML / FP. Clojure también es una excelente opción y tiene las mejores primitivas de concurrencia.

Probablemente diría F # si ya está en la plataforma .NET, de lo contrario Clojure si está en la JVM. Ambos idiomas son fáciles de integrar en una base de código existente.

Realmente no recomendaría comenzar con Scala , ya que es un lenguaje muy complejo que te permite eludir todos los problemas que encuentres, lo que podría hacer que el aprendizaje de la FP sea más lento. No digo que sea un mal lenguaje, solo se necesita mucho para usarlo en toda su extensión, y es muy fácil crear un código completamente ilegible en Scala.

Si no te importa la compatibilidad con el código existente, tanto Haskell como Erlang son excelentes idiomas. Podría ser más fácil encontrar un caso de uso para Erlang , ya que es muy bueno en lo que hace, pero si tiene tiempo y paciencia, definitivamente recomiendo ir a la ruta de Haskell , ya que le enseñará más sobre FP que cualquier otra cosa.

Además del ya mencionado Clojure, creo que también es bueno mirar a Racket. Es un esquema que se desvía ligeramente de la especificación del esquema, y ​​por una buena razón.
Racket es básicamente “el Clojure del mundo no JVM” y aunque Clojure es probablemente más práctico para los escenarios del mundo real (algunos de ellos), Racket le permite comenzar a jugar sin necesidad de estar al tanto de alguna plataforma subyacente (JVM). ). Además, Racket tiene, creo, la comunidad más vibrante de todas las implementaciones de Scheme y el mejor potencial para ser un lenguaje de uso regular y práctico para las tareas diarias (lo cual ya lo creo).

La razón por la que no creo que sea bueno comenzar con Haskell es:
– Sintaxis más compleja de aprender que Scheme.
– la escritura estática, que en sí misma no tiene relación con los principios básicos de FP y solo se interpondrá en su camino cuando se centre en el verdadero núcleo de FP
– Las mónadas son agradables y geniales y buenas para masturbarse su ego en Internet, pero, créanlo o no, no son parte del núcleo de los principios de programación funcional. Son una de las formas de lograr ciertas cosas en el desarrollo de software (y es cierto que las usará ya sea que estén conscientes de ello o no), pero no es necesario que se las obligue a revisarlas al comenzar con FP. .

Básicamente, manténgase alejado de las personas que intentarán reforzar sus egos con un novato como usted lanzando a Haskell, Scala, hablando de mónadas, tipografías estáticas, etc. No se distraiga, llegue al núcleo y trabaje su paso a paso, paso a paso, utilizando un lenguaje zen sin casi sintaxis para distraerlo.

Hoy, diría Clojure .

Es una hermosa combinación de teoría y pragmatismo. Uno de los pocos lenguajes funcionales que realmente van para estructuras inmutables y monótonas, e incluso los cambios de referencias requieren demarcación. Es decir, uno puede [casi] saber al mirar un fragmento que las referencias no cambiarán y que las estructuras referidas no pueden cambiar.

Además de la naturaleza monotónica, también se ocupa de las abstracciones de secuencia, a diferencia de la mayoría de Lisps, que tiene una secuencia concreta como el tipo canónico, que es perezosa .

[Matemáticas] Monótona + secuencia abstracta + perezosa + práctica [/ matemáticas]. Ningún otro idioma combina estos rasgos muy importantes para mí. Y, sí, amo a Haskell, pero falta un poco tanto en el cuarto como en el segundo mandato.

F # sería una muy buena opción: es más fácil que Haskell, pero muy poderoso y limpio (deje de lado las cosas de OO que son solo para interoperabilidad de C #) y servirá no solo para enseñarle un lenguaje funcional de estilo ML tipificado estáticamente, sino que también será Muy útil después para proyectos del mundo real. Obtiene acceso a una gran cantidad de bibliotecas (.NET + pure F # ones) y excelentes herramientas tanto de Microsoft (por ejemplo, Visual Studio) como de código abierto (vea Mono / Xamarin) y se ejecuta en todos los principales sistemas operativos de escritorio y móviles (a través de Xamarin). Además, F # es el único idioma en el mundo con proveedores de Tipo (aparte de Idris, un nuevo idioma experimental): una característica muy poderosa para hablar con otros sistemas.

Erlang también sería bueno, pero más para otra vista sobre la concurrencia en lugar de solo la programación funcional.