Respostas:
Um grande problema é que, se você começar com uma linguagem como Haskell, tudo o mais parecerá abaixo do padrão.
Honestamente, acho que começar com uma linguagem como Haskell ou esquema seria uma ótima idéia.
(Admito que sou viciado em linguagem funcional)
OK, o que eu gosto nos dois idiomas:
O esquema utiliza uma linguagem muito simples e cria uma linguagem maravilhosamente robusta para o desenvolvimento. Também o SICP está escrito sobre o esquema, o que faz valer a pena aprender ali. Esquema é a coisa mais simples que você pode imaginar que pode ser uma linguagem completa.
Haskell O que realmente está crescendo para mim é o sistema de tipos. Muitos dos erros que vejo em outros idiomas se devem ao tipo errado que aparece em algum lugar. Em Haskell isso é quase impossível. Além disso, a idéia de uma linguagem preguiçosa apenas causa algumas coisas legais. Por exemplo, você pode criar estruturas de dados infinitas no Haskell e, em seguida, criar apenas a parte necessária.
A maior vantagem de aprender uma linguagem funcional antes de aprender uma linguagem OOP é que suas habilidades de programação se desenvolvam primeiro e, em seguida, você pode entender facilmente os conceitos de OOP. Se você começar diretamente com uma linguagem OOP, terá que aprender duas coisas simultaneamente: "pensar no código" e "pensar no OOD". Pode ser uma distração. Primeiro pratique com uma linguagem funcional e desenvolva suas habilidades de programação. Então aprenda OOP e outros paradigmas. Como a OOP foi projetada para compensar as deficiências na programação estrutural, será mais fácil entender o porquê. Essa é a razão pela qual os cursos de CS começam com C e depois seguem para C ++.
Sobre a questão de como aprender programação iniciando com programação funcional, duas recomendações clássicas:
O primeiro, e óbvio, é o clássico Estrutura e Interpretação de Programas de Computador , de Abelson e Sussman, que continua sendo uma das melhores introduções ao CS por aí, e é ensinado de uma perspectiva funcional, usando o Scheme. Está disponível na íntegra online . Se você não começar por aqui, deve chegar aqui em algum momento.
Um texto mais recente que cobre a maior parte do mesmo terreno em um ritmo mais suave e com um foco mais forte na engenharia de software é How to Design Programs , de Matthew Felleisen e vários outros da equipe Racket / PLT, que usa o dialeto Racket de Esquema. Também está disponível online , assim como a segunda edição em andamento . Este livro tem a vantagem de ter sido projetado para ser usado com o ambiente de programação DrRacket, que fornece uma interface muito amigável para iniciantes e especialistas para experimentar o código.
Sobre a questão de por que começar com a programação funcional, eu gostaria de apontar para o Blog de Bob Harper . Carnegie Mellon recentemente reformulou seu currículo de CS para ensinar programação funcional primeiro, e Harper vem cobrindo seu progresso, golpe por golpe, em seu blog. Como um dos responsáveis por trás da definição do Standard ML, é óbvio que ele é a favor dessa mudança e argumenta bem as razões para isso.
Finalmente, eu recomendaria não aprender Haskell primeiro, embora outros possam discordar. Enquanto a abordagem pura de Haskell ao FP certamente criará bons hábitos, o foco da linguagem na computação preguiçosa não é necessariamente uma boa combinação para o iniciante; Uma das primeiras e mais importantes coisas que você precisará aprender a fazer como programador é raciocinar exatamente sobre o que seu programa está fazendo olhando a fonte e sobre o custo relativo de diferentes abordagens para o mesmo problema. É minha experiência que a preguiça de Haskell torna essas duas atividades um desafio até para programadores experientes, embora Sua milhagem possa variar.
A principal vantagem (ou desvantagem) de começar com o FP é que a maioria dos conceitos também se aplica à programação imperativa. Realm of Racket usa analogias de videogame para ensinar conceitos funcionais e imperativos, e os alunos dedicados ficam não apenas com um jogo funcional (npi), mas com um sólido entendimento de condicionais, recursão, loops, ADTs e design orientado a eventos. Esses conceitos são praticamente onipresentes na programação moderna e são usados constantemente.
Ainda mais importante, porém, é aprender a codificar abstrações , algo em que o FP é excelente, com o uso de funções e tipos de dados de ordem superior. Como criar programas adota uma abordagem única para isso, ensinando através da indução. Por exemplo, os alunos aprendem como fold
funciona examinando o código para obter a soma e o produto de uma lista, descobrindo o que eles têm em comum e derivando a implementação eles mesmos.
O equivalente ao POO acima provavelmente envolveria um ou mais dos seguintes itens: interfaces, classes abstratas, genéricos, functores ou (se você estiver fazendo errado) singletons. Embora esses sejam padrões de design perfeitamente aceitáveis em Java, o IMHO não pertence a um currículo introdutório e serve apenas para ofuscar os princípios subjacentes. Mesmo como alguém que foi introduzido nas linguagens FP "atrasado", posso dizer que navegar pelo mar sempre em mudança do OOP foi muito mais fácil por ter uma forte âncora funcional.
RACKETEERS
. Não tenho certeza quando expira, desculpe.
A programação funcional facilita muito as coisas. Nos idiomas OOP, você precisa lidar com o gerenciamento de estado em vários segmentos sem arruinar esse estado. Nas linguagens funcionais, quando a maior parte do trabalho está sendo realizada por funções puras, você não precisa se preocupar com isso.
Em termos de velocidade / desempenho, eu não sou um jóquei de desempenho real, mas ser funcional não significa ser lento, e a estrutura das linguagens funcionais tem pouco a ver com sua velocidade. A sintaxe das linguagens funcionais varia muito, como as diferenças entre Clojure e Haskell. O Clojure é muito rápido como está e pode alcançar (e às vezes exceder) as velocidades do Java com a otimização após o fato.
Então tudo depende realmente do que você está procurando
Eu acho que a disponibilidade de material de aprendizagem, alguns bons exemplos de código e mentores são muito importantes ao aprender linguagens de programação. Dependendo da sua situação, você pode ter um mentor que possa lhe ensinar, etc. Isso significa que você progredirá mais lentamente em comparação com o aprendizado de idiomas comuns. Mas se você não estiver com pressa, isso não será um problema.
Talvez o motivo mais importante para considerar o aprendizado de linguagens de programação funcionais seja o entendimento de tipos de dados algébricos. O mapeamento mental ajudará na modelagem das relações de classe OO e até no design do banco de dados.
O foco em sistemas multi-core / multi-processador enfatiza o uso de algoritmos paralelos que podem ser expressos de forma mais clara e concisa no FP. O ramo lambda dos idiomas provavelmente verá um forte aumento no uso nas próximas uma a duas décadas.
Mas também existem algumas armadilhas comuns. Acreditar que o FP é mais simples é um grande erro, pois calcular a complexidade do espaço e do tempo, além de fornecer provas de interrupção, pode ser muito mais desafiador no cálculo lambda, especialmente em idiomas que suportam uma avaliação lenta.
Então, aprenda os dois! Ou talvez melhor: primeiro aprenda um idioma que abraça ambos, como o Scala. Se você não se importa com camisetas tie-die e um leve sotaque holandês, talvez você ache as palestras de FP do Dr. Erik Meijer úteis, que estão no MSDN.