É muito parecido com o fato de aprender matemática melhorar suas habilidades analíticas e aprender literatura latina / clássica melhorará suas habilidades de escrita.
As pessoas que criaram esses idiomas 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 o tornará um programador melhor. E aprendendo C. Os benefícios reais vêm do aprendizado de idiomas com uma filosofia diferente. Então você pode ter sua própria opinião sobre a forma como um programa deve ser escrito.
Editar
Sei que essa resposta não é tão útil para pessoas que ainda não aprenderam haskell e / ou cece. Aqui estão alguns exemplos para explicar melhor o que quero dizer
LISP
O Lisp acredita que a sintaxe deve ser mínima e que tudo deve ser uma lista ou uma primitiva (Lisp significa Processamento de lista). Mesmo os programas são principalmente lista contendo outras listas e símbolos. Lisp permite manipular programas como lista e gerar novos programas em tempo real. Daí o code is data and data is code
lema inteiro .
A conseqüência direta é que as linguagens Lisp permitem definir qualquer interface desejada. Um bom exemplo é o compojure, que é uma estrutura da web clojure. Aqui está a aparência de uma função de roteamento
(defroutes app-routes
(GET "/" [] view/page)
(GET "/api" [] (wrap-aleph-handler api/socket-handler))
(route/resources "/static")
(route/not-found "page not found"))
Outro bom exemplo é a estrutura de modelos de soluços:
(html [:ul
(for [x (range 1 4)]
[:li x])])
Como você pode ver, o resultado é tão conciso quanto no DSL, como o bigode, mas permite que você use os recursos de linguagem como (for [x (range 1 4)] block)
. Ainda melhor, você tem todas as ferramentas para abstrair e estruturar seu código.
Em outros idiomas, a sintaxe é mais complexa. Você não pode ler um programa Java como um monte de listas. Mas, usando o Lisp, você tem uma idéia melhor sobre como deve ser a interface ideal e o que pode ser abstraído em seu código como dados. Também ajuda a ver seu idioma favorito como uma estrutura de big data e a entender melhor sua semântica.
Haskell
Haskell acredita em forte digitação estática e pureza. Funções puras são como funções matemáticas: elas são definidas em um conjunto de valores e as mapeiam 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 multiparadigma possa ter. Uma linguagem é pura ou não.
Uma conseqüência é que você não pode executar ações de IO quando quiser (os haskellers acreditam que isso é uma coisa boa). As ações de IO são definidas como transações, que são valores puros. O main
valor de um programa haskell é uma transação de E / S executada quando você executa o programa.
Você precisa lidar explicitamente com o fluxo de dados no seu programa. Você não pode fazer a comunicação de dois componentes escrevendo e 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 outros idiomas têm digitação estática, no haskell você pode ter coisas como:
length :: [a] -> Int
(função de uma lista de a para int)
map :: (a -> b) -> [a] -> [b]
(função que recebe uma a to b
transformação e uma lista de a e retorna uma lista de b)
O bom é que não preciso explicar o que essas funções realmente fazem: você já entende o comportamento delas. Além do mais, as funções com essas assinaturas não podem nada além de calcular o comprimento de uma lista e mapear uma transformação sobre uma lista.
Em outras linguagens digitadas, as hierarquias de classe combinadas com a mutabilidade tornam o tratamento desses tipos um pesadelo. Você precisa entender coisas como covariância e contravariância, que são impossíveis de corrigir da perspectiva da linguagem (ou seja, simples, poderosas e seguras).
Você segue o caminho seguro (como o scala) e acaba com uma linguagem realmente complexa, ou segue o caminho simples e obtém algo que é limitado (genéricos do google go limitados à lista e mapas) ou inseguro (genéricos de dardo que são sempre covariante).
Usando o haskell, você aprende principalmente sobre os benefícios da pureza e como escrever código puro.