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?
41
Respuestas:
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 code
lema.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
Otro buen ejemplo es el marco de plantillas de hipo:
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
main
valor 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 unaa to b
transformació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.
fuente
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:
De: ¿Por qué es útil Lisp?
Haskell
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.
Divulgación: Esta es una publicidad desvergonzada del peor tipo, porque es de mi blog.
fuente
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.
fuente