¿Cuáles son las ventajas de usar LISP y Haskell? ¿Me harán un mejor programador? [cerrado]

41

Sé que Lisp y Haskell son lenguajes de programación lógicos y funcionales respectivamente, pero ¿qué significa esto exactamente? ¿Cómo se diferencian de otros idiomas? He oído que aprender esto te hará un mejor programador y mejorará tu lógica. ¿Es esto cierto, y si voy a aprender Lisp o Haskell a un nivel competente, mejorará mi programación y seré mejor para manejar cualquier problema en cualquier idioma? Solo quería saber para ver si vale la pena el esfuerzo de aprender. ¿Estos lenguajes también son útiles en áreas como GUI y gráficos o son solo útiles para aplicaciones de consola?

Logan545
fuente
36
Usar LISP y Haskell te hará un mejor programador de LISP y Haskell, te lo garantizo.
Neil
17
@MasonWheeler tengo que decir; hay mucho en el sistema de tipos de Haskell que no encontrará en ningún otro idioma, y ​​las macros LISP no se encuentran en ningún otro idioma. Vale la pena aprender ambas cosas porque te hacen un mejor programador en tu idioma de trabajo. Al menos esta ha sido mi experiencia; Haskell me convirtió en un mejor desarrollador empresarial de C #. Conozco técnicas para implementar la separación de las preocupaciones de manera limpia que nunca hubiera tenido de otra manera, y los problemas de análisis siempre serán mucho más simples para mí que antes de aprender Haskell.
Jimmy Hoffa
66
Erlang es un lenguaje funcional. Rabbit MQ está escrito en Erlang y Rabbit se usa en muchos lugares para hacer mucho trabajo pesado de misión crítica. Los lenguajes funcionales le enseñan a pensar de manera diferente sobre la programación, y esa es una buena herramienta adicional para tener a su disposición. Si bien es cierto que algunos de esos conceptos se han convertido en lenguajes más populares (por ejemplo, expresiones lambda en C # y C ++), aún aborda la resolución de problemas de una manera muy diferente cuando utiliza un lenguaje funcional.
Binario Worrier
8
@MasonWheeler Hay perfectamente buenas razones por las que un lenguaje puede ser más útil que el resto, pero aún no se usa ampliamente. Puedo pensar en muchos: la base de usuarios existente, un cambio demasiado radical, cuando "lo bueno es lo suficientemente bueno", y también ... cuando la mejor herramienta requiere programadores con una formación más formal. Por lo tanto, la popularidad no es una buena medida de utilidad .
Andres F.
55
@MasonWheeler Para usar una analogía, las matemáticas son un campo muy útil en la vida real. Entonces, ¿por qué no hay más personas competentes en matemáticas? ¿Por qué mucha gente le tiene miedo y piensa que es magia negra y no es tan útil?
Andres F.

Respuestas:

37

Es muy parecido a aprender matemáticas mejorará tus habilidades analíticas y aprender literatura latina / clásica mejorará tus habilidades de escritura.

Las personas que diseñaron esos idiomas han pensado mucho sobre lo que significa escribir un programa. Y esos idiomas son el resultado de esas investigaciones.

Dicho esto, aprender Java también te hará un mejor programador. Y aprender C. Los beneficios reales provienen de aprender idiomas con una filosofía diferente. Entonces puede tener su propia opinión sobre la forma en que se debe escribir un programa.

Editar

Me doy cuenta de que esta respuesta no es tan útil para las personas que aún no han aprendido haskell y / o lisp. Aquí hay algunos ejemplos para explicar más a fondo lo que quiero decir.

CECEO

Lisp cree que la sintaxis debería ser mínima y que todo debería ser una lista o una primitiva (Lisp significa procesamiento de lista). Incluso los programas son principalmente listas que contienen otras listas y símbolos. Lisp le permite manipular programas como lista y generar nuevos programas sobre la marcha. De ahí todo el code is data and data is codelema.

La consecuencia directa es que los lenguajes Lisp le permiten definir cualquier interfaz que desee. Un buen ejemplo es compojure, que es un marco web clojure. Así es como se ve una función de enrutamiento

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

Otro buen ejemplo es el marco de plantillas de hipo:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

Como puede ver, el resultado es tan conciso como en DSL como bigote, pero le permite usar las funciones del lenguaje como (for [x (range 1 4)] block). Aún mejor, tiene todas las herramientas para abstraer y estructurar su código.

En otros idiomas, la sintaxis es más compleja. No puede leer un programa Java como un montón de listas. Pero al usar Lisp, obtienes una mejor idea sobre cómo debería ser una interfaz ideal y qué elementos de tu código se pueden extraer como datos. También le ayuda a ver su idioma favorito como una gran estructura de datos y a comprender mejor su semántica.

Haskell

Haskell cree en la tipificación estática fuerte y la pureza. Las funciones puras son como funciones matemáticas: se definen en un conjunto de valores y se asignan en otro conjunto. La función no tiene efectos secundarios y los valores son inmutables. La pureza es interesante porque no es algo que pueda tener un lenguaje de paradigmas múltiples. Un lenguaje es puro o no.

Una consecuencia es que no puede realizar acciones de IO cuando lo desee (haskellers cree que esto es algo bueno). Las acciones IO se definen como transacciones, que son en sí mismas valores puros. El mainvalor de un programa haskell es una transacción IO ejecutada cuando ejecuta el programa.

Tiene que lidiar explícitamente con el flujo de datos en su programa. No puede hacer que dos componentes se comuniquen escribiendo y leyendo cosas en una variable global. Tienes que construir y pasar valores.

Otra característica mencionada por Jimmy Hoffa es el sistema de tipo rico. Mientras que otros idiomas tienen escritura estática, en haskell puedes tener cosas como:

length :: [a] -> Int (función de una lista de a's a un int)

map :: (a -> b) -> [a] -> [b](función que toma una a to btransformación y una lista de a, y devuelve una lista de b)

Lo bueno es que no necesito explicar qué hacen realmente esas funciones: ya entiendes su comportamiento. Lo que es más, las funciones con esas firmas no pueden realmente más que calcular la longitud de una lista y mapear una transformación sobre una lista.

En otros lenguajes mecanografiados, las jerarquías de clase combinadas con la mutabilidad hacen que lidiar con esos tipos sea una pesadilla. Debe comprender cosas como la covarianza y la contravarianza, que son imposibles de entender desde la perspectiva del lenguaje (es decir, simple, potente y seguro).

O tomas el camino seguro (como scala) y terminas con un lenguaje realmente complejo, o tomas el camino simple y obtienes algo que es limitado (google go genéricos limitados a listas y mapas) o inseguro (dart generics que siempre son covariante).

Al usar haskell, aprende principalmente sobre los beneficios de la pureza y cómo escribir código puro.

Simon Bergot
fuente
1
@JimmyHoffa Creo que realmente merece su propia respuesta, porque esto es lo que la gente tiende a pasar por alto. Hay dominios problemáticos que se resuelven mejor mediante programación funcional que las personas ni siquiera se dan cuenta de que existen hasta que al menos han incursionado en esos dominios fuera de su zona de confort.
KChaloux
2
No sé acerca de la Asamblea, y tampoco lo mencioné. Sin embargo, el ensamblaje puede ayudarlo a comprender cómo se ejecutan sus programas. Hay excelentes publicaciones sobre SO de personas que pueden analizar una pieza de ensamblaje generado para explicar un problema de rendimiento.
Simon Bergot
3
@KChaloux Escribiría la respuesta, pero esta pregunta debería cerrarse (cierro la votación en consecuencia). En pocas palabras, podría escribir mi opinión y experiencia en una respuesta, pero no sería más correcto o incorrecto que las otras respuestas, que es el problema de las preguntas de recomendación de idioma y por qué voté para cerrar.
Jimmy Hoffa
77
Dios mío, @Neil sabiendo lo que la computadora está haciendo con toda seguridad lo convertirá en un mejor programador. No he escrito ensamblaje en años, pero lo leo regularmente (en un montón de plataformas) y si te importa cómo funciona realmente tu programa, es fundamental conocer al menos los conceptos básicos.
dash-tom-bang
3
@Neil, ¿en qué caso ser un peor programador es un beneficio? ¿Qué te hace abrir el código de espagueti? ¿Qué tiene que ver el código de espagueti con el ensamblaje o ser un buen programador, excepto en la tierra de fantasía de no conocer el ensamblaje y necesitar una racionalización para evitar aprenderlo? En todo caso, ser un buen codificador de ensamblaje hace que uno sea muy consciente de las malas prácticas de codificación.
dash-tom-bang
12

tl; dr Aprender cosas nuevas solo puede hacerte un mejor programador, pero ser un mejor programador no se trata de los idiomas en los que puedes escribir código.

¿Cuáles son las ventajas de usar LISP y Haskell?

CECEO:

  1. Código homoicónico Esto permite un código estructurado de auto-modificación.
  2. Macros compatibles con la sintaxis. Permiten reescribir el código repetitivo.
  3. Pragmatismo. CL está diseñado para hacer cosas hechas por profesionales que trabajan. La mayoría de los lenguajes funcionales no son, por regla general.
  4. Flexibilidad. Puede hacer muchas cosas diferentes, todas a velocidades razonables.
  5. Verrugas El mundo real es desordenado. La codificación pragmática termina teniendo que usar o inventar construcciones desordenadas. Common Lisp tiene suficiente verrugas que puede hacer cosas.

Podría decirse que las únicas razones reales para elegir en contra de CL es que las bibliotecas estándar están fechadas.

Me arriesgaré y diré que, en el caso general, la sintaxis no debería ser un problema para un trabajador de software profesional.

De: ¿Por qué es útil Lisp?

Haskell

Haskell es un lenguaje de programación de computadoras. En particular, es un lenguaje polimórficamente estático, flojo, puramente funcional, bastante diferente de la mayoría de los otros lenguajes de programación. El lenguaje lleva el nombre de Haskell Brooks Curry, cuyo trabajo en lógica matemática sirve como base para los lenguajes funcionales. Haskell se basa en el cálculo lambda, de ahí la lambda que usamos como logotipo.

Puede leer una descripción de funcional versus imperativo

De: http://www.haskell.org/haskellwiki/Introduction

¿Me harán un mejor programador?

Sí, por supuesto, conocer más lenguajes y paradigmas solo puede convertirte en un mejor programador, pero hazlo bien:

No hay una sola herramienta, un solo libro, un solo paradigma de programación que te haga un mejor programador.

Aprender diferentes lenguajes de programación con diferentes paradigmas definitivamente te ayuda a ser un mejor programador, aprender a resolver problemas con diferentes enfoques también beneficia enormemente tu pensamiento lógico.

Ser un buen programador no se trata mucho del lenguaje, sino de tener la capacidad de resolver cualquier problema en cualquier idioma. Y cuando no conoces el idioma, la capacidad de aprender ese idioma rápidamente y usarlo de manera efectiva.

Creo que cuanto más global sea su pensamiento, mejor desarrollador será.

Por ejemplo, puede agregar comentarios útiles a su código, preocuparse por la legibilidad de su código, la facilidad de mantenimiento. Presta atención a los pequeños detalles. Piensa antes de escribir! Aprende sobre los patrones de diseño. Sigue buenas prácticas.

Divulgación: Esta es una publicidad desvergonzada del peor tipo, porque es de mi blog.

jsedano
fuente
44
¿Has aprendido LISP o Haskell a algún nivel competente?
Jimmy Hoffa
10
Es un poco falso escuchar esto de alguien que no sabe casi nada de ninguno de los dos idiomas. Afirma que no son herramientas que necesita en este momento, pero no tiene idea de para qué son herramientas, entonces, ¿cómo puede saberlo? Además, ¿cómo puede aconsejar a alguien lo que aprenderá o no de ellos? Por lo que usted sabe, LISP es un derivado de SQL solo útil en el análisis de datos relacionales y Haskell podría ser un subconjunto estricto de Regexp.
Jimmy Hoffa
10
Esto realmente no responde la pregunta. Tuviste éxito en la impresionante hazaña de dar una respuesta vagamente general a una pregunta sobre dos idiomas que no conoces: /
Andres F.
2
-1 porque esto baila vagamente en torno a lo que exactamente Common Lisp y Haskell te enseñan. Ejemplos: Código como Datos de datos como código, pureza, transparencia referencial, abstracciones monádicas, programación funcional, programación orientada al lenguaje, programación dirigida por tipo, etc., etc.
Daniel Gratzer
3
Además, sin saber ninguno de los dos idiomas, no creo que puedas responder a esa pregunta: / Lo siento
Daniel Gratzer
9

Cuando aprendes idiomas que están fuera del paradigma que usualmente operas, te abrirá la mente a soluciones alternativas en tu día a día e incluso puede ayudarte a comprender mejor algunas características en tu idioma de elección. El solo hecho de saber esos idiomas no lo convertirá en un mejor programador a menos que pueda tomar las lecciones que aprendió de esos idiomas y aplicarlo a situaciones que ve todos los días.

Dicho esto, no se limita a los idiomas. Cuando lee sobre varias estructuras de datos que no ha visto o usado antes, puede ayudarlo a ampliar el alcance de su conocimiento para que la próxima vez que encuentre un problema tenga una posible solución más.

Jetti
fuente