Elegir un lenguaje de programación funcional [cerrado]

48

Últimamente he leído muchos hilos sobre lenguajes de programación funcionales (de hecho, casi en el último año). Realmente me gustaría elegir uno y aprenderlo a fondo.

El último semestre [del curso], me presentaron a Scheme. Me encantó. Me encantó la extrema simplicidad de la sintaxis, el principio de homoiconicidad , las macros ( higiénicas y no higiénicas), la n-aridad de los procedimientos, etc.

El problema con Scheme es que es un lenguaje académico. No creo que se use realmente en entornos de producción. Tampoco creo que sea particularmente bueno tenerlo en nuestro currículum. Entonces, he estado buscando alternativas. Hay muchos de ellos y de alguna manera todos parecen tener un nivel similar de popularidad.

Algunas reflexiones sobre otros lenguajes funcionales que he considerado todavía:

  • Clojure: Suena genial porque puede acceder al mundo de Java, está orientado hacia la escalabilidad y la concurrencia, pero ¿no está el mundo de Java al borde en este momento? Ya conozco Java bastante bien, pero ¿sería prudente agregar aún más energía dependiendo de la JVM?
  • Haskell: Parece un idioma muy apreciado, pero por lo que he leído, también es más un lenguaje académico.
  • Lisp: Ha existido desde siempre. Parece tener la mayoría de lo que me gusta de Scheme. Tiene una gran comunidad. Por lo que [creo que sé], es probablemente el lenguaje de programación funcional más utilizado en la industria (?).
  • F #: Realmente no lo consideré. No soy un gran fanático de las cosas de la EM. No tengo el dinero para pagar sus softwares (podría liberarlos de las alianzas universitarias, pero estoy más inclinado a buscar soluciones impulsadas por la comunidad). Aunque ... supongo que sería la mejor opción orientada a la carrera.

Esta noche, me estoy inclinando hacia Lisp. Hace una semana, fue Haskell. Antes de eso era Clojure. El año pasado, estaba haciendo un esquema para divertirme, no presionarlo por la razón que sabes. Ahora me gustaría hablar en serio (sobre aprender uno, sobre hacer proyectos reales con él, sobre quizás eventualmente trabajar profesionalmente con él). Mi problema es que necesitaría aprenderlos todos en profundidad antes de poder elegir uno.

Joanis
fuente
55
Lo que elija, escriba una gran cantidad de código que use para algo en él.
8
¿No pensaste en Scala ?
ykombinator
@ykombinator: he oído hablar de él, pero no he buscado más. No sé si tendría algo que ofrecer sobre los que enumeré, o tal vez traería una combinación de opciones interesantes de cada uno de ellos ... No lo sé. A mí me parece un lenguaje de perfil bastante bajo, aunque parece estar ganando popularidad.
Joanis
1
No sé dónde escuchó que el mundo de Java está "al límite": actualmente está pasando por un gran renacimiento, en gran parte gracias a a) OpenJDK que se está convirtiendo en la implementación estándar b) nuevos lenguajes JVM como Scala y Clojure yc) hecho de que los proyectos de big data / cloud están aumentando eligiendo JVM como plataforma de destino yd) Android. A principios de 2012, es probable que sea la plataforma más emocionante única para estar en .....
mikera
1
@mikera: De acuerdo. Esto tiene más de un año, justo después de que Oracle adquirió Sun Microsystems y hubo tanta preocupación y especulaciones sobre el futuro de Java comprometido por una corporación más controladora que toma el control ... ¡La JVM parece bastante segura en este momento, afortunadamente!
Joanis

Respuestas:

35

Como quieres un  lenguaje práctico :

texto alternativo

Tenga en cuenta que Haskell y Lisp se usan más que los demás en la industria, aunque ha habido un interés reciente en Clojure y F #.

Pero mira lo que sucede cuando agregamos Scheme a la mezcla:

texto alternativo

Hmm, ahora no se parece tanto a un lenguaje académico, ¿verdad?

En realidad, el gráfico anterior es probablemente una mentira; la palabra "esquema" puede aparecer en anuncios de ayuda en otros contextos además de los lenguajes de programación. :)

Así que aquí hay otro gráfico que es probablemente (un poco) más representativo:

texto alternativo

Si quieres explorar un dialecto realmente increíble de Scheme, echa un vistazo a Racket.

Robert Harvey
fuente
Wow, buen post. Racket es exactamente lo que estoy usando ... PLT-Scheme era su nombre cuando comencé a aprenderlo. Esa línea roja en el último gráfico me preocupa. Nunca pensé que Scheme podría usarse tanto. Y Clojure seguro parece estar despegando. Hmm ...
Joanis
@METRO. Joanis: Toma los dos últimos gráficos con un grano de sal; El aspecto de la escalera y la volatilidad del último gráfico sugieren que no hay muchos puntos de datos en el gráfico, aunque sí indica que alguien piensa que vale la pena pagar por los idiomas.
Robert Harvey
@Robert Harvey, ¿qué cambió del segundo al tercer gráfico?
systemovich
@ Geoffrey: Mira los subtítulos; Agregué la palabra "desarrollador" a los términos de búsqueda.
Robert Harvey
Tenga en cuenta que Haskell y Lisp también son homónimos y que los datos de Indeed no se generalizan al resto del mundo. ITJobsWatch enumera 79 trabajos de Scala, 55 F #, 47 Haskell, 30 trabajos de Lisp y 7 de Clojure.
Jon Harrop
17

Si desea aprender programación funcional, es mejor que primero aprenda Haskell y luego use el idioma que desee. Puede aprender programación funcional usando los otros lenguajes, pero aún permiten código imperativo y orientado a objetos. Si escribe un programa real en Haskell, aprenderá la programación funcional más rápido porque los otros paradigmas no estarán disponibles para recurrir.

Después de escribir su programa Haskell, tendrá herramientas como mónadas y técnicas como codificación sin puntos para llevar al idioma de su elección. Los conceptos parecen correlacionar especialmente bien con Scheme.

Larry Coleman
fuente
Creo que tienes razón al elegir un lenguaje funcional puro primero. Estaría muy interesado en ver un orden de lenguajes funcionales por pureza.
Joanis
@METRO. Joanis: de los idiomas enumerados en su pregunta, diría que Haskell es el más puro, seguido de Clojure, F # y Lisp.
Larry Coleman
15

En realidad, si pudieras implementar un sistema razonablemente complejo en Scheme, serías bastante deseable en empresas donde probablemente quieras trabajar. Al principio de mi carrera me encontré con algunos estudiantes que habían realizado una buena cantidad de trabajo en Scheme, y la única vez que fue una desventaja fue cuando no pudieron explicar su trabajo o no lo entendieron lo suficientemente bien como para implementar datos básicos. estructuras y algoritmos en un tiempo razonable. Siempre dejo que los candidatos respondan esas preguntas en su idioma preferido; Me encontré con algunas personas que pensaban que eran mejores en Scheme y que lograron luchar bastante con cosas que deberían ser fáciles, como agregar un elemento a una lista vinculada, lo que me desconcertó.

Pero si pudieras "obtener" el esquema lo suficientemente bien como para escribir incluso una aplicación web promedio, eso sería un buen punto de venta en la mayoría de las compañías de software serias.

Si estuvieras entrevistando en una tienda "blub" y los desarrolladores pensaran que eras raro por tu habilidad en Scheme o Haskell o F #, probablemente no querrías trabajar allí. En la mayoría de los casos, los desarrolladores competentes pueden elegir conciertos, así que no se preocupe por la "practicidad" a menos que las únicas opciones que pueda imaginar en su futuro sean corporativas. Trabaja para ser competente, flexible y resolver problemas.

La universidad no se trata de practicidad. Se trata de crear un ambiente seguro para explorar y aprender. De hecho, eso es útil, incluso si termina escribiendo software ordinario para el resto de su carrera.

Dicho esto, no veo por qué querría limitarse a una de esas opciones tan pronto. Podrías tener una idea fácil de los cuatro idiomas en aproximadamente 4 semanas, luego elegir uno para concentrarte en esas mallas con tus caprichos actuales. Luego, regrese a otra de sus opciones e intente implementar algo similar. Pase a algo más complejo y considere sus opciones nuevamente. La experimentación es buena. A menos que esté tratando de ganarse la vida el próximo mes, aún no necesita convertirse en especialista.

He escrito algunos en Scheme, F #, Emacs Lisp y Common Lisp, y leí al menos un poco de Haskell, al menos ocasionalmente en los últimos años. No puedo decir que soy un experto en ninguno de ellos, pero cada excursión a esos idiomas me ha beneficiado en todos los demás idiomas en los que trabajo profesionalmente (C #, Java, Ruby y, ocasionalmente, Boo, Perl y Python). La curiosidad te construirá una carrera más duradera y satisfactoria que cualquier otra cosa.

JasonTrue
fuente
2
"La curiosidad te dará una carrera más duradera y satisfactoria que cualquier otra cosa". Esta declaración es muy inspiradora. Tienes razón. Estoy muy apurado. Siempre siento que todo tomará demasiado tiempo para aprender ... Si pudiera retroceder 12 años, cuando comenzara, sabría que no perderé todo mi tiempo en VB y C ++. Siento que estos años fueron muy malgastados. No tenía la curiosidad suficiente. Quería codificar cosas. Usar los idiomas que sabía era suficiente. En ese momento pensé que estaba sabiendo bastante, pero que tan horriblemente no era el caso en absoluto.
Joanis
10

Me sumergí en Haskell por un tiempo, pero la conclusión a la que llegué fue que era demasiado académico. Fue muy difícil hacer algo práctico. En un lenguaje funcional puro, cosas como IO simplemente no encajan en el modelo, por lo que tienes que lidiar con mónadas. Decidí que tendría que dedicar una gran cantidad de tiempo para ser apenas competente, así que seguí adelante.

Hice Scheme en la universidad. Puede sonar trivial, pero todos los padres realmente distraen / molestan. Es difícil volver a eso después de usar lenguajes como Python.

Recientemente he estado explorando F #. Es funcional, pero también puede ser imperativo y orientado a objetos cuando lo desee. Esto, junto con la posibilidad de utilizar cualquier biblioteca .NET, permite mezclar fácilmente sus partes funcionales puras con cosas más prácticas como GUI, IO y redes. Puede obtener una versión independiente de F #.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en

Erik
fuente
El hecho de que F # y Clojure no sean puramente funcionales juega un papel importante a su favor. Tal vez F # podría ser mi punto de entrada en la familia .Net algún día ...
Joanis
1
@MJoanis, declaró el costo como un punto contra F #, pero como señala Erik, puede obtenerlo completamente gratis.
Benjol
Si leo los términos correctamente, básicamente lo obtienes gratis con la condición de no usarlo (o comprar licencias). Pero entiendo que aún puede ser algo muy bueno aprender en caso de que termine en una empresa que usa Visual Studio. Probablemente lo intentaré una vez que sea funcional con un lenguaje de programación funcional más gratuito.
Joanis
1
@METRO. Joanis: No, F # es incluso de código abierto y puedes intentar ejecutarlo en Mono en otras plataformas.
Jon Harrop
Tal vez los tiempos han cambiado desde 2010, pero como alguien que comenzó a aprender haskell en los últimos meses, no creo que hacer IO en haskell sea difícil en absoluto. Para cosas básicas, solo necesita aprender algo de nueva sintaxis do. Obtener la comprensión fundamental real lleva algunas semanas como máximo, pero realmente no veo de qué se trata la mónada. No creo que fueran más difíciles de aprender que las clases, las instancias, los miembros estáticos y todos los demás jazz relacionados con el estado en OOP.
Sara
9

Evalué todos los principales lenguajes funcionales hace uno o dos años, desde la perspectiva de querer un lenguaje de programación funcional práctico y de propósito general.

Terminé eligiendo Clojure , que posteriormente resultó ser una excelente opción.

En términos generales, las razones clave fueron:

  • Ecosistema de bibliotecas : para que un idioma sea útil, necesita acceso a buenas bibliotecas. Estar en la JVM significa que tiene fácil acceso a la biblioteca de código abierto más grande y al ecosistema de herramientas, por lo que optar por un lenguaje JVM fue obvio desde una perspectiva pragmática. Scala también obtuvo una puntuación alta aquí.

  • Macro-metaprogramación : este aspecto de Lisp siempre me atrajo, especialmente porque anticipé generar bastante código. Aprecio mucho los argumentos formulados en el breve ensayo de Paul Graham " Superando los promedios ". Los diversos Lisps obtuvieron una fuerte puntuación aquí.

  • El rendimiento fue "suficientemente bueno": Clojure siempre se compila y obtiene los beneficios del optimizador JVM JIT y el excelente GC. Como siempre, hay un poco de sobrecarga en el uso de un lenguaje funcional, pero con Clojure estaba claro que cada uno puede acercarse a la velocidad de Java con un poco de esfuerzo (Clojure admite primitivas de Java y tipeo estático opcional para aquellas situaciones donde lo necesita). Mi estimación es que Clojure es de 2 a 5 veces más lento de lo que podría lograr con el código optimizado de Java o C ++, que es consistente con lo que ve en los puntos de referencia defectuosos , y con el tiempo espero que esa brecha se reduzca aún más. Además, es bastante fácil simplemente escribir código particularmente sensible al rendimiento en Java puro y llamarlo desde Clojure.

  • Concurrencia : Clojure tiene un enfoque bastante único y poderoso de concurrencia, particularmente para la concurrencia altamente multinúcleo Es un poco difícil de explicar, pero este video es excelente para dar una idea de los principios. Creo que Clojure actualmente tiene la mejor respuesta a la pregunta difícil "¿cómo debe administrar el estado compartido, concurrente y mutable en un lenguaje de programación funcional?".

  • Diseño del lenguaje : Clojure es IMO, un diseño de lenguaje muy bien pensado. Los ejemplos son tener literales vectoriales [] y de mapa {} además de los paréntesis regulares de Lisp, el uso de estructuras de datos persistentes inmutables, el apoyo a la pereza en todo el lenguaje a través de la abstracción de secuencia y proporcionar al programador una variedad de características ortogonales para resolver diferentes problemas . Vea el arte de la abstracción y lo simple hecho fácil .

  • Comunidad : siempre subjetiva, pero me gustó lo que vi en la comunidad de Clojure. La actitud fue muy útil, constructiva y pragmática. Hay un fuerte énfasis en "hacer las cosas", posiblemente reflejando el hecho de que mucha gente de Clojure (incluido el propio Rich Hickey) proviene de un entorno de construcción de sistemas empresariales complejos. El hecho de que la comunidad Clojure también tenga fuertes vínculos con la comunidad Java fue importante para convencerme de que Clojure no correría el riesgo de quedar atrapado en un "nicho".

Si tuviera que nombrar un par de inconvenientes menores de Clojure, estos serían:

  • Escritura dinámica : a menudo esto es una ventaja en términos de productividad, pero en promedio creo que cambiaría esto por una verificación e inferencia de tipos más fuertes. En general, esto se mitiga al tener un buen conjunto de pruebas automatizadas, pero si le gustan sus tipos validados estáticamente por el compilador, entonces Haskell o Scala pueden ser más su taza de té.

  • Vanguardia : Clojure se está desarrollando muy rápido y hay mucha innovación en curso; la desventaja de esto es que hay mucha experimentación, algunas bibliotecas y herramientas aún son inmaduras, y hay cambios ocasionales entre las versiones principales de Clojure. Necesito vigilar.

Sin embargo, en general, ¡no creo que pueda equivocarse con Clojure si desea un lenguaje funcional moderno excelente y pragmático!

mikera
fuente
1
¡Gracias! ¡Buena publicación! Simplemente, en estos días, estaba considerando usarlo para un proyecto interno de la compañía que se basará en gran medida en los árboles y la recursividad. Además, tenemos bastante código Java por aquí que podemos reutilizar con Clojure.
Joanis
6

Parece que has hecho tu tarea, por lo que probablemente ya lo sepas, pero Scheme es un dialecto de Lisp al igual que Common Lisp. Si le gustan muchas cosas sobre Scheme, pero no le gusta su naturaleza académica, pruebe Common Lisp. Según el índice TIOBE , es el decimotercer lenguaje más popular frente a Scheme en la posición 26.

Pocos de los idiomas que ha mencionado aparecen en las descripciones de trabajo que he visto recientemente, aunque ese podría ser mi pequeño conjunto de muestras. Personalmente aprenderé Haskell, aunque no espero usar ese idioma directamente en mi trabajo. Los conceptos de programación funcional son más valiosos para mí para futuros diseños de programas que la comercialización directa del lenguaje en sí.

Zeke
fuente
Gracias por el enlace TIOBE, esa es una referencia interesante. Supongo que está eligiendo Haskell por su pureza en términos de programación funcional.
Joanis
1
@ M.Joanis: Más o menos, aunque estoy pensando en recoger más tarde a Lisp también. Ver programmers.stackexchange.com/questions/18838/…
Zeke
La respuesta elegida tiene mucho sentido. La pureza parece ser el camino a seguir hasta que realmente haya comprendido todo el paradigma funcional.
Joanis