Es muy parecido a que 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 del aprendizaje de idiomas con diferentes filosofías. 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 o lisp. Aquí hay algunos ejemplos para explicar con más detalle lo que quiero decir
LISP
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 listas). 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í el lema entero code is data and data is code
.
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 de clojure. Aquí es cómo 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 las plantillas de hipo:
(html [:ul
(for [x (range 1 4)]
[:li x])])
Como puede ver, el resultado es tan conciso como en DSL como el bigote, pero le permite usar las funciones de idioma como (for [x (range 1 4)] block)
. Aún mejor, tienes todas las herramientas para abstraer y estructurar tu código.
En otros idiomas, la sintaxis es más compleja. No puedes leer un programa Java como un montón de listas. Pero al usar Lisp, obtendrá una mejor idea de cómo debería ser una interfaz ideal, y lo que en su código se puede abstraer como información. También le ayuda a ver su lenguaje favorito como una estructura de big data y a comprender mejor su semántica.
Haskell
Haskell cree en la tipificación estática y la pureza fuertes. Las funciones puras son como las 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 un lenguaje de paradigma múltiple pueda tener. Un lenguaje es puro o no.
Una consecuencia es que no puedes realizar una acción de IO siempre que lo desees (los haskellers creen que esto es algo bueno). Las acciones IO se definen como transacciones, que son en sí mismas valores puros. El valor main
de un programa haskell es una transacción IO ejecutada cuando ejecutas el programa.
Debe tratar explícitamente el flujo de datos en su programa. No puede hacer que dos componentes se comuniquen escribiendo & Leer cosas en una variable global. Tienes que construir y pasar valores.
Otra característica mencionada por Jimmy Hoffa es el rico sistema de tipos. Mientras que otros idiomas tienen escritura estática, en haskell puedes tener cosas como:
length :: [a] -> Int
(función de una lista de a a int)
map :: (a -> b) -> [a] -> [b]
(función que toma una transformada a to b
y una lista de a, y devuelve una lista de b)
Lo bueno es que no necesito explicar lo que realmente hacen esas funciones: ya entiendes su comportamiento. Lo que es más, las funciones con esas firmas no pueden ser más que calcular la longitud de una lista y asignar una transformación en una lista.
En otros lenguajes escritos, las jerarquías de clase combinadas con la mutabilidad hacen que lidiar con esos tipos sea una pesadilla. Tienes que entender cosas como la covarianza y la contravarianza, que son imposibles de entender desde una perspectiva lingüística (es decir, simple, potente y segura).
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 se limita a la lista y los mapas) o inseguro (Dart Genérico que son siempre covariantes).
Al usar haskell, aprendes principalmente sobre los beneficios de la pureza y cómo escribir código puro.