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
(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 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 una a 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.