Vou ordenar este guia pelo nível de habilidade que você tem em Haskell, passando de um iniciante a um especialista. Observe que esse processo levará muitos meses (anos?), Portanto é bastante longo.
Principiante Absoluto
Em primeiro lugar, Haskell é capaz de qualquer coisa, com habilidade suficiente. É muito rápido (atrás apenas de C e C ++ na minha experiência) e pode ser usado para qualquer coisa, desde simulações a servidores, guis e aplicativos da web.
No entanto, existem alguns problemas que são mais fáceis de escrever para um iniciante em Haskell do que outros. Problemas matemáticos e programas de processos de lista são bons candidatos para isso, pois exigem apenas o conhecimento mais básico de Haskell para poder escrever.
Em primeiro lugar, alguns bons guias para aprender o básico do Haskell são o tutorial feliz aprender haskell e os 6 primeiros capítulos de aprender um haskell . Ao ler estes, é uma boa idéia também resolver problemas simples com o que você conhece.
Outros dois bons recursos são a Programação Haskell desde os primeiros princípios e a Programação em Haskell . Os dois vêm com exercícios para cada capítulo, para que você tenha pequenos problemas simples que correspondem ao que aprendeu nas últimas páginas.
Uma boa lista de problemas para tentar é a página de problemas do haskell 99 . Eles começam muito básicos e ficam mais difíceis à medida que avança. É uma prática muito boa fazer muitas delas, pois elas permitem que você pratique suas habilidades nas funções de recursão e ordem superior. Eu recomendaria ignorar quaisquer problemas que exijam aleatoriedade, pois isso é um pouco mais difícil em Haskell. Verifique esta questão de SO caso queira testar suas soluções com o QuickCheck (consulte Intermediário abaixo).
Depois de ter feito alguns deles, você pode passar a resolver alguns dos problemas do Project Euler . Eles são classificados por quantas pessoas os concluíram, o que é uma boa indicação de dificuldade. Eles testam sua lógica e Haskell mais do que os problemas anteriores, mas você ainda deve conseguir fazer os primeiros. Uma grande vantagem que Haskell tem com esses problemas é que os números inteiros não são limitados em tamanho. Para concluir alguns desses problemas, será útil ler os capítulos 7 e 8 de aprender um Haskell também.
Principiante
Depois disso, você deve ter um bom conhecimento das funções de recursão e ordem superior, por isso seria um bom momento para começar a resolver alguns problemas do mundo real. Um bom lugar para começar é o Mundo Real Haskell (livro on-line, você também pode comprar uma cópia impressa). Eu achei os primeiros capítulos introduzidos muito rapidamente para alguém que nunca havia feito programação funcional / usado recursão antes. No entanto, com a prática que você teria de resolver os problemas anteriores, você deve achar perfeitamente compreensível.
Trabalhar com os problemas do livro é uma ótima maneira de aprender a gerenciar abstrações e criar componentes reutilizáveis no Haskell. Isso é vital para as pessoas acostumadas à programação orientada a objetos (oo), pois os métodos normais de abstração oo (classes oo) não aparecem no Haskell (Haskell possui classes de tipo, mas são muito diferentes das classes oo, mais como interfaces oo ) Não acho que seja uma boa idéia pular capítulos, pois cada um deles apresenta muitas novas idéias usadas nos capítulos posteriores.
Depois de um tempo, você chegará ao capítulo 14, o temido capítulo das mônadas (dum dum dummmm). Quase todo mundo que aprende Haskell tem problemas para entender as mônadas, devido ao quão abstrato o conceito é. Não consigo pensar em nenhum conceito em outra linguagem que seja tão abstrato quanto as mônadas na programação funcional. Mônadas permite que muitas idéias (como operações de E / S, cálculos que possam falhar, análise, ...) sejam unificadas sob uma idéia. Portanto, não desanime se, depois de ler o capítulo das mônadas, você realmente não as entender. Achei útil ler muitas explicações diferentes das mônadas; cada um dá uma nova perspectiva sobre o problema. Aqui está uma lista muito boa de tutoriais de mônada . Eu recomendo o All About Monads , mas os outros também são bons.
Além disso, leva um tempo para que os conceitos sejam realmente absorvidos. Isso ocorre pelo uso, mas também pelo tempo. Acho que às vezes dormir com um problema ajuda mais do que qualquer outra coisa! Eventualmente, a idéia clicará e você se perguntará por que lutou para entender um conceito que, na realidade, é incrivelmente simples. É incrível quando isso acontece, e quando acontece, você pode achar que Haskell é sua linguagem de programação imperativa favorita :)
Para ter certeza de que você está entendendo perfeitamente o sistema do tipo Haskell, tente resolver 20 exercícios intermediários do haskell . Esses exercícios usam nomes divertidos de funções como "furry" e "banana" e ajudam você a entender bem alguns conceitos básicos de programação funcional, se ainda não os tiver. Ótima maneira de passar a noite com um monte de papéis cobertos por flechas, unicórnios, salsichas e bananas peludas.
Intermediário
Depois de entender o Monads, acho que você fez a transição de um programador iniciante em Haskell para um intermediário. Então, para onde ir a partir daqui? A primeira coisa que eu recomendaria (se você ainda não os aprendeu aprendendo mônadas) são os vários tipos de mônadas, como Reader, Writer e State. Mais uma vez, o mundo real Haskell e Tudo sobre as mônadas oferecem uma ótima cobertura disso. Para concluir seu treinamento em mônada, é essencial aprender sobre os transformadores de mônada. Isso permite combinar diferentes tipos de mônadas (como uma mônada do Reader e do Estado) em uma. Isso pode parecer inútil para começar, mas depois de usá-los por um tempo, você se perguntará como viveu sem eles.
Agora você pode terminar o livro Haskell do mundo real, se quiser. Ignorar capítulos agora realmente não importa, desde que você tenha mônadas. Basta escolher o que você está interessado.
Com o conhecimento que você teria agora, você poderá usar a maioria dos pacotes no cabal (pelo menos os documentados ...), bem como a maioria das bibliotecas que acompanham o Haskell. Uma lista de bibliotecas interessantes para tentar seria:
Parsec : para analisar programas e texto. Muito melhor do que usar regexps. Excelente documentação, também possui um capítulo Haskell do mundo real.
QuickCheck : Um programa de teste muito legal. O que você faz é escrever um predicado que sempre deve ser verdadeiro (por exemplo length (reverse lst) == length lst
). Em seguida, você passa o predicado ao QuickCheck e ele gera muitos valores aleatórios (nesse caso, lista) e testa se o predicado é verdadeiro para todos os resultados. Veja também o manual online .
HUnit : teste de unidade em Haskell.
gtk2hs : A estrutura gui mais popular do Haskell, permite escrever aplicativos gtk no Haskell.
happstack : Uma estrutura de desenvolvimento web para Haskell. Não usa bancos de dados, mas um armazenamento de tipo de dados. Documentos muito bons (outros frameworks populares seriam snap e yesod ).
Além disso, existem muitos conceitos (como o conceito Mônada) que você deve aprender eventualmente. Isso será mais fácil do que aprender mônadas pela primeira vez, pois seu cérebro estará acostumado a lidar com o nível de abstração envolvido. Uma visão geral muito boa para aprender sobre esses conceitos de alto nível e como eles se encaixam é a Typeclassopedia .
Aplicável: Uma interface como Mônadas, mas menos poderosa. Toda mônada é aplicável, mas não vice-versa. Isso é útil, pois existem alguns tipos que são aplicáveis, mas não são mônadas. Além disso, o código gravado usando as funções Aplicativas é geralmente mais fácil de compor do que escrever o código equivalente usando as funções Monad. Consulte Functors, Functors Aplicáveis e Monoids no guia aprender um haskell.
Dobrável , Traversable : Typeclasses que abstraem muitas das operações de listas, para que as mesmas funções possam ser aplicadas a outros tipos de contêineres. Veja também a explicação do wiki haskell .
Monóide : Um Monóide é um tipo que tem um valor zero (ou mempty) e uma operação notada <>
que une dois Monoids, como aquele x <> mempty = mempty <> x = x
e x <> (y <> z) = (x <> y) <> z
. Essas são chamadas leis de identidade e associatividade. Muitos tipos são monoides, como números, com mempty = 0
e <> = +
. Isso é útil em muitas situações.
Setas : as setas são uma maneira de representar cálculos que recebem uma entrada e retornam uma saída. Uma função é o tipo mais básico de seta, mas existem muitos outros tipos. A biblioteca também possui muitas funções muito úteis para manipular setas - elas são muito úteis mesmo se usadas apenas com funções Haskell antigas e simples.
Matrizes : as várias matrizes mutáveis / imutáveis em Haskell.
Mônada ST : permite escrever código com um estado mutável que é executado muito rapidamente, enquanto permanece puro fora da mônada. Veja o link para mais detalhes.
FRP: Programação Reativa Funcional, uma nova maneira experimental de escrever código que lida com eventos, gatilhos, entradas e saídas (como uma GUI). Eu não sei muito sobre isso embora. A palestra de Paul Hudak sobre yampa é um bom começo.
Há muitos novos recursos de idioma que você deve dar uma olhada. Vou apenas listá-los, você pode encontrar muitas informações sobre eles no google, no haskell wikibook , no site haskellwiki.org e na documentação do ghc .
- Classes do tipo multiparâmetros / dependências funcionais
- Famílias de tipos
- Tipos quantificados existencialmente
- Tipos fantasmas
- GADTS
- outras...
Um monte de Haskell é baseado em teoria de categorias , então você pode querer investigar isso. Um bom ponto de partida é a Teoria das Categorias para Cientistas da Computação . Se você não quiser comprar o livro, o artigo relacionado ao autor também é excelente.
Finalmente, você vai querer aprender mais sobre as várias ferramentas Haskell. Esses incluem:
- ghc (e todos os seus recursos)
- cabal : o sistema de pacotes Haskell
- darcs : um sistema de controle de versão distribuído escrito em Haskell, muito popular para programas Haskell.
- haddock : um gerador automático de documentação Haskell
Ao aprender todas essas novas bibliotecas e conceitos, é muito útil escrever um projeto de tamanho moderado em Haskell. Pode ser qualquer coisa (por exemplo, um pequeno jogo, analisador de dados, site, compilador ). Trabalhar nisso permitirá que você aplique muitas das coisas que está aprendendo agora. Você fica nesse nível por muito tempo (é onde eu estou).
Especialista
Você levará anos para chegar a esse estágio (olá a partir de 2009!), Mas a partir daqui, acho que você começa a escrever artigos em phd, novas extensões de ghc e novas abstrações.
Conseguindo ajuda
Finalmente, em qualquer estágio do aprendizado, há vários locais para obter informações. Esses são:
- o canal #haskell irc
- as listas de discussão . Vale a pena se inscrever apenas para ler as discussões que ocorrem - algumas são muito interessantes.
- outros locais listados na página inicial haskell.org
Conclusão
Bem, isso acabou por mais tempo do que eu esperava ... De qualquer forma, acho que é uma idéia muito boa se tornar proficiente em Haskell. Leva muito tempo, mas isso ocorre principalmente porque você está aprendendo uma maneira completamente nova de pensar. Não é como aprender Ruby depois de aprender Java, mas como aprender Java depois de aprender C. Além disso, estou descobrindo que minhas habilidades de programação orientada a objetos melhoraram como resultado do aprendizado de Haskell, pois estou vendo muitas novas maneiras de abstrair idéias.