Elegir un lenguaje de programación funcional [cerrado]

48

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

Último semestre [del curso], me han presentado el Esquema. Me encantó. Me encantó la extrema simplicidad de la sintaxis, el principio de homoiconicity , las macros ( higiénico y no higiénico), 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. Por lo tanto, he estado buscando alternativas. Hay muchos de ellos y, de alguna manera, todos parecen tener un nivel de popularidad similar.

Algunas reflexiones sobre algunos otros lenguajes funcionales que ya he considerado:

  • Clojure: suena bien porque puede acceder al mundo de Java, está orientado a la escalabilidad y la concurrencia, pero ¿no está el mundo de Java en una situación límite en este momento? Ya conozco Java bastante bien, pero ¿sería prudente agregar aún más energía en función de la JVM?
  • Haskell: parece un lenguaje 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 parte 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 de las cosas de MS. No tengo el dinero para pagar por sus softwares (podría tenerlos libres de alianzas universitarias, pero estoy más inclinado a ir con soluciones impulsadas por la comunidad). Aunque ... supongo que sería la mejor opción orientada a la carrera.

Esta noche, me inclino hacia Lisp. Hace una semana, era Haskell. Antes de eso fue Clojure. El año pasado, estaba haciendo un Esquema por diversión, no presionando por la razón que tú sabes. Ahora me gustaría ser serio (sobre aprender uno, sobre hacer proyectos reales con él, sobre cómo, eventualmente, trabajar profesionalmente con él). Mi problema es que tendría que aprenderlos en profundidad antes de poder elegir uno.

    
pregunta Joanis 08.12.2010 - 05:24

6 respuestas

36

Como quieres un lenguaje práctico :

TengaencuentaqueHaskellyLispseutilizanmásquelosdemásenlaindustria,aunquehahabidouninterésrecienteenClojureyF#.

PeromiraloquepasacuandoagregamosEsquemaalamezcla:

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 los anuncios de ayuda deseados en otros contextos además de los lenguajes de programación. :)

Así que aquí hay otra gráfica que es probablemente (un poco) más representativa:

SideseaexplorarundialectorealmentegenialdeScheme,echeunvistazoa Racket.

    
respondido por el Robert Harvey 08.12.2010 - 05:54
18

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

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

    
respondido por el Larry Coleman 08.12.2010 - 15:14
15

En realidad, si pudieras implementar un sistema razonablemente complejo en Scheme, serías bastante deseable en compañías donde probablemente querrías trabajar. Anteriormente en mi carrera me encontré con algunos estudiantes que habían hecho 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 dentro de un tiempo razonable. Siempre les dejo a los candidatos que contesten estas preguntas en su idioma preferido; Me encontré con algunas personas que pensaban que eran mejores en Scheme, 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 pudiera "obtener" el Esquema lo suficientemente bien como para escribir incluso una aplicación web promedio, ese sería un buen punto de venta para las compañías de software más importantes.

Si estuvieras entrevistando en una tienda "blub" y los desarrolladores pensaban 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 obtienen su elección de conciertos, así que no te preocupes por la "practicidad" a menos que las únicas opciones que puedas imaginar en tu futuro sean corporativas. Trabaja para ser competente, flexible y para 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 terminas escribiendo software ordinario para el resto de tu carrera.

Dicho esto, no veo por qué querrías limitarte a solo una de esas opciones tan pronto. Fácilmente podría tener una idea de los cuatro idiomas en aproximadamente 4 semanas, luego elegir uno para concentrarse en las mallas mejor con sus caprichos actuales. Luego vuelva a otra de sus opciones e intente implementar algo similar. Continúe con 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, no necesita convertirse en un especialista todavía.

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 sea un experto en ninguno de ellos, pero cada excursión a esos idiomas me ha beneficiado en todos los otros idiomas en los que trabajo profesionalmente (C #, Java, Ruby y, en ocasiones, Boo, Perl y Python). La curiosidad te hará una carrera más duradera y satisfactoria que cualquier otra cosa.

    
respondido por el JasonTrue 08.12.2010 - 06:36
9

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

Hice Scheme en la universidad. Puede sonar trivial, pero todos los parens 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 usar cualquier biblioteca .NET, hace posible mezclar fácilmente sus partes puramente funcionales con cosas más prácticas como las GUI, IO y redes. Puede obtener una versión independiente de F #.

enlace

    
respondido por el Erik 08.12.2010 - 05:59
9

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

Terminé eligiendo Clojure , que posteriormente ha demostrado ser una excelente elección.

En términos generales, las principales razones fueron:

  • Ecosistema de la biblioteca : 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 una tarea fácil desde una perspectiva pragmática. Scala también obtuvo una alta puntuación aquí.

  • Macro-metaprogramación : este aspecto de Lisp siempre me atrajo, sobre todo porque preví hacer bastante generación de código. Aprecio mucho los argumentos del breve ensayo de Paul Graham " Beating The Averages ". Los diferentes Lisps tuvieron una fuerte puntuación aquí.

  • El rendimiento fue "lo suficientemente bueno": Clojure siempre se compila y obtiene los beneficios del optimizador JVM JIT y el excelente GC. Como siempre, existe cierta sobrecarga en el uso de un lenguaje funcional, pero con Clojure estaba claro que puede acercarse a la velocidad de Java con un poco de esfuerzo (Clojure admite primitivas de Java y escritura estática opcional para aquellas situaciones en las que lo necesite). Mi estimación es que Clojure es un estadio de béisbol de 2 a 5 veces más lento de lo que podría lograr con el código Java o C ++ optimizado, lo que coincide con lo que ve en benchmarks ilegales , y con el tiempo espero que esa brecha se acorte 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 la concurrencia, en particular para la concurrencia de múltiples núcleos. Es un poco difícil de explicar, pero este video es excelente para darle una idea del principios Creo que Clojure tiene actualmente 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 de idioma : Clojure es IMO, un diseño de lenguaje muy bien pensado. Algunos ejemplos son el vector [] y el mapa {} literales 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 secuencias y el programador con una variedad de características ortogonales para resolver diferentes problemas . Consulte el arte de la abstracción y simple simplificado .

  • 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 muchas personas de Clojure (incluido el propio Rich Hickey) provienen de un fondo de construcción de sistemas empresariales complejos. El hecho de que la comunidad de Clojure tenga fuertes vínculos con la comunidad de Java también fue importante para convencerme de que Clojure no correría el riesgo de quedarse atrapado en un "nicho".

Si tuviera que nombrar un par de desventajas menores de Clojure, estas serían:

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

  • De vanguardia : Clojure se está desarrollando muy rápido y hay mucha innovación en marcha. La desventaja de esto es que hay mucha experimentación, algunas bibliotecas y herramientas aún son inmaduras. , y hay cambios de ruptura ocasionales entre las versiones principales de Clojure que necesita vigilar.

Sin embargo, en general, no creo que puedas equivocarte con Clojure si quieres un lenguaje funcional moderno excelente y pragmático.

    
respondido por el mikera 13.01.2012 - 07:20
6

Parece que has hecho tu tarea, así que probablemente ya lo sepas, pero Scheme es un dialecto de Lisp como Common Lisp. Si te gustan muchas cosas sobre Scheme, pero no te gusta su naturaleza académica, prueba Common Lisp. Según el índice TIOBE , es el 13º idioma más popular entre los esquemas en la posición 26.

Pocos de los idiomas que ha mencionado aparecen en las descripciones de los trabajos 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í.

    
respondido por el Zeke 08.12.2010 - 05:30

Lea otras preguntas en las etiquetas