É muito parecido com aprender matemática vai melhorar suas habilidades analíticas e aprender literatura latina / clássica irá melhorar suas habilidades de escrita.
As pessoas que criaram essas linguagens pensaram muito sobre o que significa escrever um programa. E essas línguas são os resultados dessas pesquisas.
Dito isto, aprender Java também fará de você um programador melhor. E aprendendo C. Os benefícios reais vêm do aprendizado de idiomas com filosofia diferente. Então você pode ter sua própria opinião sobre como um programa deve ser escrito.
Editar
Eu percebo que essa resposta não é tão útil para pessoas que ainda não aprenderam haskell e / ou lisp. Aqui estão alguns exemplos para explicar mais o que quero dizer
LISP
Lisp acredita que a sintaxe deve ser mínima e que tudo deve ser uma lista ou uma primitiva (Lisp significa List Processing). Mesmo programas são principalmente lista contendo outras listas e símbolos. Lisp permite manipular programas como lista e gerar novos programas rapidamente. Daí todo o code is data and data is code
lema.
A consequência direta é que as linguagens Lisp permitem que você defina qualquer interface desejada. Um bom exemplo é o compojure, que é um framework web clojure. Aqui está como uma função de roteamento se parece
(defroutes app-routes
(GET "/" [] view/page)
(GET "/api" [] (wrap-aleph-handler api/socket-handler))
(route/resources "/static")
(route/not-found "page not found"))
Outro exemplo interessante é a estrutura de modelos de soluços:
(html [:ul
(for [x (range 1 4)]
[:li x])])
Como você pode ver, o resultado é tão curto quanto no DSL, como o bigode, mas permite que você use os recursos de idioma, como (for [x (range 1 4)] block)
. Ainda melhor, você tem todas as ferramentas para abstrair e estruturar seu código.
Em outras linguagens, a sintaxe é mais complexa. Você não pode ler um programa Java como um monte de listas. Mas, usando Lisp, você tem uma ideia melhor sobre como deve ser uma interface ideal e o que em seu código pode ser abstraído como dados. Ele também ajuda você a ver sua linguagem favorita como uma estrutura de big data e a entender melhor sua semântica.
Haskell
Haskell acredita em strong tipagem estática e pureza. Funções puras são como funções matemáticas: são definidas em um conjunto de valores e mapeadas em outro conjunto. A função não tem efeitos colaterais e os valores são imutáveis. A pureza é interessante porque não é algo que uma linguagem multi-paradigmática possa ter. Uma linguagem é pura ou não.
Uma consequência é que você não pode executar a ação de IO sempre que quiser (os haskellers acreditam que isso é bom). As ações de IO são definidas como transações, que são elas próprias valores puros. O valor main
de um programa haskell é uma transação IO executada quando você executa o programa.
Você precisa lidar explicitamente com o fluxo de dados em seu programa. Você não pode fazer dois componentes se comunicarem escrevendo & lendo coisas em uma variável global. Você tem que construir e passar valores.
Outro recurso mencionado por Jimmy Hoffa é o sistema de tipos ricos. Enquanto outras linguagens têm tipagem estática, no haskell você pode ter coisas como:
length :: [a] -> Int
(função de uma lista de a's para int)
map :: (a -> b) -> [a] -> [b]
(função que usa uma transformação a to b
e uma lista de a's e retorna uma lista de b's)
Em outras linguagens tipificadas, as hierarquias de classes combinadas com a mutabilidade tornam o tratamento desses tipos um pesadelo. Você tem que entender coisas como covariância e contravariância, que são impossíveis de acertar do ponto de vista da linguagem (ou seja, simples, poderoso e seguro).
Ou você toma o caminho seguro (como scala) e termina com uma linguagem muito complexa, ou pega o caminho simples e obtém algo que é limitado (google go generics limitado a lista e mapas) ou inseguro (dart genéricos que são sempre covariantes).
Usando o haskell, você aprende principalmente sobre os benefícios da pureza e como escrever código puro.