Pregunta

He leído un montón de hilos sobre lenguajes de programación funcional últimamente (casi en el último año, de hecho).Realmente me gustaría que elegir uno y aprender a fondo.

Última [curso] semestre, he sido introducido en el Esquema.Me encantó.Amó a la extrema sencillez de su sintaxis, la homoiconicity principio, las macros (higiene y no higiénicas), la n-arity de procedimientos, etc.

El problema con el Esquema, se trata de un lenguaje académico.Creo que no es muy utilizado en entornos de producción.Yo no creo que es particularmente bueno tener en nuestro curriculum.Así que, he estado buscando alternativas.Hay muchos de ellos y que de alguna manera todos parecen tener un nivel similar de popularidad.

Algunos pensamientos acerca de otros lenguajes funcionales he considerado aún:

  • Clojure:Suena genial porque se puede acceder al mundo de Java, que está orientado hacia la escalabilidad y la simultaneidad, pero no es el mundo de Java en un borde ahora?Ya sé Java bastante bien, pero sería bueno agregar aún más energía en función de la JVM?
  • Haskell:Parece un muy apreciado idioma, pero por lo que he leído, es más de un lenguaje académico.
  • Lisp:Ha existido desde siempre.Parece que a la mayoría de lo que me gusta de Esquema.Tiene una gran comunidad.Por lo que yo [creo yo] sé, es probablemente el más ampliamente utilizado lenguaje de programación funcional en la industria(?).
  • F#:En realidad no cuenta.Yo no soy un gran fan de MS cosas.No tengo el dinero para pagar por su software (que podría haber libre de la universidad de alianzas, pero yo estoy más inclinado a ir con la comunidad soluciones orientadas).Aunque...Supongo que sería la mejor carrera orientada a la elección.

Esta noche, me estoy inclinando hacia Lisp.Hace una semana, fue Haskell.Antes de que se Clojure.El año pasado, estaba haciendo un Esquema para la diversión, no empujándolo por la razón que usted sabe.Ahora me gustaría ponerme serio sobre el aprendizaje de uno, se trata de hacer proyectos reales con él, tal vez el tiempo profesionalmente a trabajar con él).Mi problema es que tendría que aprender de todos ellos en profundidad antes de ser capaz de elegir uno.

¿Fue útil?

Solución

Ya que quieres un práctico idioma:

alt text

Observe que Haskell y Lisp se usan más que los otros en la industria, aunque ha habido algún interés reciente en Clojure y F#.

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

alt text

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

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

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

alt text

Si quieres explorar un dialecto realmente saqueado de esquema, eche un vistazo a Raqueta.

Otros consejos

Si desea aprender programación funcional, es posible que se sirva mejor para aprender primero a Haskell, luego use el idioma que desee. Puede aprender programación funcional utilizando los otros idiomas, pero aún así permiten un código imperativo y orientado a objetos. Si escribe un programa real en Haskell, aprenderá una 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 la codificación de puntuación para aportar al lenguaje de su elección. Los conceptos parecen mapear especialmente bien para esquiar.

En realidad, si fueron capaces de implementar una razonablemente complejo sistema en el Esquema, sería bastante deseable en empresas donde quizás quieras trabajar.Antes en mi carrera me encontré con algunos estudiantes que habían realizado una buena cantidad de trabajo en el Esquema, y el único momento en que era una desventaja fue cuando fueron incapaces de explicar su trabajo o en realidad no entienden lo suficientemente bien como para implementar básicas de algoritmos y estructuras de datos dentro de una cantidad razonable de tiempo.Yo siempre vamos a la respuesta de los candidatos a tales preguntas en el idioma de su preferencia;Lo hice correr en algunas personas que pensaban que eran mejores en el Esquema que se las arregló para luchar un poco con la de cosas que debe ser fácil, como la adición de un elemento a una lista enlazada, que me embaucó.

Pero si fueron capaces de "sacar" Esquema lo suficientemente bien como para escribir un promedio de aplicación web, que sería un buen punto de venta en la mayoría de las serias compañías de software.

Si se entrevista a un "blub" de la tienda y los desarrolladores sólo pensé que usted era raro debido a su habilidad en el Esquema o Haskell o F#, usted probablemente no quiere trabajar allí.En la mayoría de los casos, competentes, los desarrolladores de su elección de los conciertos, así que no te preocupes por "sentido práctico", a menos que las únicas opciones que usted puede imaginar en su futuro empresarial.Trabajo sobre el ser competente, flexible, y la superación de los problemas.

La universidad no es acerca de la practicidad.Se trata de crear un ambiente seguro para explorar y aprender.Que es, en realidad, útil, incluso si al final de la escritura ordinaria de software para el resto de su carrera.

Dicho esto, no veo por qué usted quiere limitar a sólo una de esas opciones tan pronto.Usted puede fácilmente obtener un sentido de los cuatro idiomas en alrededor de 4 semanas, a continuación, elija uno se concentre en el que se adapta mejor a su actual caprichos.A continuación, volver a otra de sus opciones y tratar de implementar algo similar.Pasar a algo más complejo, y considerar sus opciones de nuevo.La experimentación es bueno.A menos que usted está tratando de ganarse la vida el próximo mes, usted no necesita ser un especialista sin embargo.

He escrito algunos en el Esquema, F#, Emacs Lisp, y Common Lisp, y leer al menos un poco de Haskell, al menos ocasionalmente, en los últimos años.Yo no puedo decir que soy un experto en ninguno de ellos, pero cada excursión en aquellas lenguas en las que se ha beneficiado de mí en todos los otros idiomas que yo trabajo de manera profesional, (C#, Java, Ruby, y ocasionalmente Boo, Perl y Python).La curiosidad le construye una más duradero, carrera satisfactoria que cualquier otra cosa.

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 debes lidiar con las mónadas. Determiné que tendría que dedicar una gran cantidad de tiempo para ser apenas competente, así que seguí adelante.

Lo hice en la universidad. Puede sonar trivial, pero todos los Parens realmente distraen/molestan. Es difícil volver a eso después de usar idiomas 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 poder usar cualquier biblioteca de .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

Evalué todos los idiomas funcionales principales hace un año o dos, 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 opción.

En términos generales, las razones clave fueron:

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

  • Macro-metaprograma - Este aspecto de Lisp siempre me atrajo, especialmente porque anticipé hacer un poco de generación de código. Aprecio mucho los argumentos hechos en el breve ensayo de Paul Graham "Superando los promedios". Las diversas PLISP anotaron fuertemente aquí.

  • Actuación fue "lo suficientemente bueno": Clojure siempre se compila y obtiene los beneficios del JVM JIT Optimiser y Excelente GC. Como siempre, hay algo de sobrecarga en el uso de un lenguaje funcional, pero con Clojure estaba claro que cada uno puede cerca de la velocidad de Java con un poco de esfuerzo (Clojure admite primitivas Java y una tipificación estática opcional para esas situaciones en las que lo necesita). Mi estimación es que Clojure es Ballpark 2-5x más lento de lo que podría lograr con el código Java o C ++ optimizado, que es consistente con lo que ves en el puntos de referencia defectuosos, y con el tiempo espero que esa brecha se limite más. Además, es bastante fácil escribir un código particularmente sensible al rendimiento en Java puro y llamarlo desde Clojure.

  • Concurrencia - Clojure tiene un enfoque bastante único y poderoso para la concurrencia, particularmente para la concurrencia altamente múltiple. Es un poco difícil de explicar, pero Este video es excelente para probar los principios. Creo que Clojure actualmente tiene la mejor respuesta a la difícil pregunta "¿Cómo debe administrar un estado compartido, concurrente y mutable en un lenguaje de programación funcional?".

  • Diseño de idiomas - Clojure es en la OMI un diseño de lenguaje muy bien pensado. Los ejemplos son tener literales vectoriales [] y MAP {} además de las paréntesis LISP regulares, el uso de estructuras de datos persistentes inmutables, que respalda la pereza en todo el lenguaje a través de la abstracción de la secuencia y proporcionando al programador una variedad de características ortogonales para resolver diferentes problemas para resolver . Ver El arte de la abstracción y Simple hecho fácil.

  • Comunidad - Siempre subjetivo, pero me gustó lo que vi en la comunidad de Clojure. La actitud fue muy útil, constructiva y pragmática. Hay un fuerte énfasis de "obtener cosas", posiblemente reflejando el hecho de que muchas personas de Clojure (incluido el propio Hickey rico) provienen de un fondo de construcción de sistemas empresariales complejos. El hecho de que la comunidad Clojure tenga fuertes vínculos con la comunidad de Java también fue importante para convencerme de que Clojure no corre el riesgo de quedar atrapado en un "nicho".

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

  • Tipificación dinámica - A menudo, esta es una ventaja en términos de productividad, pero en promedio creo que lo intercambiaría por una verificación e inferencia de tipo más fuerte. Principalmente esto se mitiga al tener una buena suite de prueba automatizada, pero si le gustan sus tipos validados válidos por el compilador, entonces Haskell o Scala pueden ser más su taza de té.

  • Innovador - Clojure se está desarrollando muy rápido y hay mucha innovación en curso. mantener vigilado.

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

Parece que ha hecho su tarea, por lo que probablemente ya lo sepa, pero el esquema es un dialecto de Lisp como lo es común. Si te gustan muchas cosas sobre el esquema, pero no te gusta su naturaleza académica, intente un Lisp Common. De acuerdo con la Índice Tiobe, es el 13º Idioma más popular frente al esquema 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, estaré aprendiendo a 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í.

Licenciado bajo: CC-BY-SA con atribución
scroll top