Começando com o Haskell

Por alguns dias, tentei envolver meu paradigma de functional programming em Haskell. Eu fiz isso lendo tutoriais e assistindo screencasts, mas nada realmente parece ficar. Agora, ao aprender várias linguagens imperativas / OO (como C, Java, PHP), os exercícios têm sido uma boa maneira de eu ir. Mas desde que eu realmente não sei o que Haskell é capaz e porque há muitos novos conceitos para utilizar, eu não sabia por onde começar.

Então, como você aprendeu o Haskell? O que fez você realmente “quebrar o gelo”? Além disso, alguma boa idéia para exercícios iniciais?

Vou pedir este guia pelo nível de habilidade que você tem no haskell, indo de um novato absoluto até um especialista. Note que este processo levará muitos meses (anos?), Então é bastante longo.

Iniciante Absoluto

Em primeiro lugar, o 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 até servidores, guis e aplicações web.

No entanto, existem alguns problemas que são mais fáceis de escrever para um iniciante no haskell do que outros. Problemas matemáticos e programas de processos de lista são bons candidatos para isso, já que eles apenas requerem o conhecimento mais básico de haskell para serem capazes de escrever.

Em primeiro lugar, alguns bons guias para aprender os fundamentos básicos do haskell são o tutorial de aprenda feliz de haskell e os primeiros 6 capítulos de aprender um haskell . Ao lê-los, é uma boa idéia também resolver problemas simples com o que você sabe.

Outros dois bons resources são a programação Haskell, dos primeiros princípios , e a programação em Haskell . Ambos vêm com exercícios para cada capítulo, então você tem pequenos problemas simples que combinam com o que você aprendeu nas últimas páginas.

Uma boa lista de problemas para tentar é a página de problemas do haskell 99 . Estes começam muito básicos, e ficam mais difíceis à medida que você continua. É uma prática muito boa fazer muitos deles, pois eles permitem que você pratique suas habilidades em funções de recursion e ordem superior. Eu recomendaria pular quaisquer problemas que exijam aleatoriedade, pois isso é um pouco mais difícil no haskell. Marque esta pergunta SO caso queira testar suas soluções com o QuickCheck (veja Intermediário abaixo).

Depois de ter feito alguns desses, você poderia passar a fazer alguns dos problemas do Project Euler . Estes são classificados por quantas pessoas os completaram, o que é uma boa indicação de dificuldade. Estes testes sua lógica e haskell mais do que os problemas anteriores, mas você ainda deve ser capaz de fazer os primeiros. Uma grande vantagem que o haskell tem com esses problemas é que os inteiros não são limitados em tamanho. Para completar alguns desses problemas, será útil ler os capítulos 7 e 8 de como aprender um haskell também.

Principiante

Depois disso, você deve ter um bom controle sobre a recursion e funções de ordem superior, por isso seria um bom momento para começar a fazer alguns problemas mais reais. Um bom lugar para começar é o Real World Haskell (livro online, você também pode comprar uma cópia impressa). Eu encontrei os primeiros capítulos introduzidos muito rapidamente demais para alguém que nunca fez functional programming / usado recursion antes. No entanto, com a prática que você teria de fazer os problemas anteriores, você deve achar isso perfeitamente compreensível.

Trabalhar com os problemas do livro é uma ótima maneira de aprender como gerenciar abstrações e criar componentes reutilizáveis ​​no haskell. Isto é vital para pessoas acostumadas à programação orientada a object (oo), já que os methods de abstração oo normais (oo classs) não aparecem no haskell (haskell possui classs de tipos, mas são muito diferentes de oo classs, mais como oo interfaces ). Eu não acho que é uma boa idéia pular capítulos, pois cada um apresenta muitas idéias novas que são usadas em capítulos posteriores.

Depois de um tempo, você chegará ao capítulo 14, o temido capítulo das mônadas (dum dum dumm). Quase todo mundo que aprende haskell tem dificuldade em 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 em functional programming. O Monads permite que muitas idéias (como operações de E / S, cálculos que podem falhar, análise, …) sejam unificadas sob uma única idéia. Portanto, não se sinta desanimado se, depois de ler o capítulo sobre as mônadas, você realmente não as entender. Achei útil ler muitas explicações diferentes de mônadas; cada um dá uma nova perspectiva sobre o problema. Aqui está uma lista muito boa de tutoriais monad . Eu recomendo o All About Monads , mas os outros também são bons.

Além disso, leva algum tempo para que os conceitos realmente afundem. Isso vem do uso, mas também do tempo. Eu acho que às vezes dormindo em um problema ajuda mais do que qualquer outra coisa! Eventualmente, a idéia vai clicar, e você vai se perguntar por que você se esforçou para entender um conceito que, na realidade, é incrivelmente simples. É incrível quando isso acontece, e quando isso acontece, você pode encontrar haskell para ser sua linguagem de programação imperativa favorita 🙂

Para se certificar de que você está entendendo perfeitamente o sistema de tipos Haskell, você deve tentar resolver 20 exercícios intermediários de haskell . Esses exercícios usam nomes divertidos de funções como “peludo” e “banana” e ajuda você a ter uma boa compreensão de alguns conceitos básicos de functional programming, se você não os tiver já. Nice maneira de passar a noite com uma lista de papel coberto com setas, unicórnios, salsichas e bananas peludas.

Intermediário

Uma vez que você entenda o Monads, eu acho que você fez a transição de um programador de haskell iniciante para um haskeller intermediário. Então, para onde ir a partir daqui? A primeira coisa que eu recomendaria (se você ainda não aprendeu a aprender 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 mônadas dá grande cobertura disso. Para completar o seu treinamento de mônada, aprender sobre os transformadores monad é uma obrigação. Estes permitem combinar diferentes tipos de Mônadas (como uma mônada de Leitor e Estado) em uma. Isso pode parecer inútil para começar, mas depois de usá-los por um tempo você vai se perguntar como você viveu sem eles.

Agora você pode terminar o livro de haskell do mundo real se quiser. Agora, pular capítulos não importa, contanto que você tenha mônadas. Basta escolher o que você está interessado.

Com o conhecimento que você teria agora, você deve ser capaz de usar a maioria dos pacotes em cabal (bem documentados pelo menos …), bem como a maioria das bibliotecas que vêm com haskell. Uma lista de bibliotecas interessantes para tentar seria:

  • Parsec : para analisar programas e texto. Muito melhor que usar regexps. Excelente documentação, também tem um capítulo haskell do mundo real.

  • Quickcheck : Um programa de testes muito legal. O que você faz é escrever um predicado que deve ser sempre verdadeiro (por exemplo, length (reverse lst) == length lst ). Você então passa o predicado o quickCheck, e ele irá gerar muitos valores randoms (neste caso, listas) e testar se o predicado é verdadeiro para todos os resultados. Veja também o manual online .

  • HUnit : Teste de unidade no haskell.

  • gtk2hs : O framework de gui mais popular para o haskell, permite escrever aplicações gtk no haskell.

  • happstack : Um framework de desenvolvimento web para haskell. Não usa bancos de dados, em vez disso, um armazenamento de tipo de dados. Muito bons docs (outros frameworks populares seriam snap e yesod ).

Além disso, existem muitos conceitos (como o conceito Monad) que você deve aprender. Isso será mais fácil do que aprender Monads 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 encheckboxm é a Typeclassopedia .

  • Applicative: Uma interface como Monads, mas menos poderosa. Toda Mônada é Aplicativa, mas não vice-versa. Isso é útil, pois existem alguns tipos que são aplicáveis, mas não são Monads. Além disso, o código escrito usando as funções Aplicativas é geralmente mais comporável do que escrever o código equivalente usando as funções do Monad. Veja Functors, Applicative Functors e Monoids da aprenda um guia de haskell.

  • Dobrável , Traversable : Typeclasss 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 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 juntos, tal que x <> mempty = mempty <> x = x x <> (y <> z) = (x <> y) <> z . Estas são chamadas leis de identidade e associatividade. Muitos tipos são Monoids, 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 input e retornam uma saída. Uma function é o tipo mais básico de seta, mas existem muitos outros tipos. A biblioteca também tem muitas funções muito úteis para manipular flechas – elas são muito úteis mesmo se usadas apenas com funções haskell antigas.

  • Arrays : os vários arrays mutáveis ​​/ imutáveis ​​em haskell.

  • ST Monad : permite escrever código com um estado mutável que é executado muito rapidamente, enquanto ainda permanece puro fora da mônada. Veja o link para mais detalhes.

  • FRP: Functional Reactive Programming, uma nova maneira experimental de escrever código que lida com events, triggers, inputs e saídas (como um gui). Eu não sei muito sobre isso. A palestra de Paul Hudak sobre o yampa é um bom começo.

Existem muitos novos resources de linguagem que você deve examinar. 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âmetro / dependencies funcionais
  • Digite as famílias
  • Tipos quantificados existencialmente
  • Tipos fantasma
  • GADTS
  • outras…

Um monte de haskell é baseado em teoria de categorias , então você pode querer olhar para isso. Um bom ponto de partida é a Teoria da Categoria para Cientistas da Computação . Se você não quiser comprar o livro, o artigo relacionado do autor também é excelente.

Finalmente, você vai querer aprender mais sobre as várias ferramentas do haskell. Esses incluem:

  • ghc (e todos os seus resources)
  • cabal : o sistema de pacotes haskell
  • darcs : um sistema de version control distribuído escrito em haskell, muito popular para programas haskell.
  • haddock : um gerador automático de documentação haskell

Enquanto aprende 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 você está aprendendo agora. Você fica neste nível por muito tempo (é aqui que estou).

Especialista

Você levará anos para chegar a esse estágio (olá a partir de 2009!), Mas daqui eu acredito que você comece a escrever documentos phd, novas extensões ghc e criar novas abstrações.

Conseguindo ajuda

Finalmente, enquanto em qualquer estágio do aprendizado, há vários lugares para obter informações. Esses são:

  • o canal #haskell irc
  • as listas de discussão . Vale a pena inscrever-se apenas para ler as discussões que acontecem – algumas são muito interessantes.
  • outros lugares listados na página inicial do haskell.org

Conclusão

Bem, isso acabou mais do que eu esperava … Enfim, acho que é uma boa idéia se tornar proficiente em haskell. Leva muito tempo, mas isso é principalmente porque você está aprendendo uma maneira completamente nova de pensar fazendo isso. 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 orientadas a objects melhoraram como resultado do aprendizado de haskell, já que estou vendo muitas novas maneiras de abstrair idéias.

Algum colega meu teve uma boa experiência com Learn You a Haskell para Great Good! .

Tutorial destinado a pessoas com experiência em linguagens de programação imperativas, mas que não foram programadas em uma linguagem funcional antes.

E verifique as respostas aqui também

Aqui está um bom livro que você pode ler online: Real World Haskell

A maioria dos programas do Haskell que fiz foram para resolver problemas do Project Euler .

Uma vez que eu li um conselho, não muito tempo atrás, é que você deve ter um conjunto padrão de problemas simples que você sabe como resolver (em teoria) e, em seguida, sempre que você tentar aprender um novo idioma, você implementa esses problemas nesse idioma.

Eu gostei de assistir a esta série de 13 episódios sobre functional programming usando Haskell.

C9 Palestras: Dr. Erik Meijer – Fundamentos da Programação Funcional: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/

Para adicionar as respostas dos outros – há um útil que irá ajudá-lo durante a codificação (por exemplo, ao resolver problemas do projeto Euler): Hoogle . Você pode usar a interface de linha de comando ou a interface da web .

Linha de comando

Depois de instalar a plataforma Haskell, certifique-se de cabal install hoogle

Exemplo de uso do Hoogle:

Você tem uma function fx = 3 * x + 1 e quer aplicá-la em (5 :: Int) , então aplique-a no resultado e naquele resultado e assim por diante e obtenha uma lista infinita desses valores. Você suspeita que já existe uma function para ajudá-lo (não especificamente para o seu f ).

Essa function seria do tipo (a -> a) -> a -> [a] se tomar f 5 ou a -> (a -> a) -> [a] se levar 5 f (assumimos a function é para tipos gerais e não apenas Int s)

 $ hoogle "a -> (a -> a) -> [a]" Prelude iterate :: (a -> a) -> a -> [a] 

Sim, a function que você precisa já existe e é chamada de iterate . você usa iterate func 5 !

interface web

O resultado para o mesmo exemplo pode ser encontrado aqui .

A Programação de Graham Hutton em Haskell é concisa, razoavelmente completa, e seus anos de ensino em Haskell realmente mostram. É quase sempre o que eu recomendo que as pessoas comecem, independentemente de onde você for a partir daí.

Em particular, o Capítulo 8 (“Parsers Funcionais”) fornece a base real que você precisa para começar a lidar com as mônadas, e eu acho que é de longe o melhor lugar para começar, seguido por All About Monads . (No que diz respeito a esse capítulo, note a errata do site, no entanto: você não pode usar o formulário sem uma ajuda especial. Você pode querer aprender sobre typeclasss primeiro e resolver o problema por conta própria.)

Isso raramente é enfatizado para os iniciantes do Haskell, mas vale a pena aprender bem no início, não apenas sobre o uso de mônadas, mas sobre como construir o seu próprio. Não é difícil, e os personalizados podem tornar um número de tarefas um pouco mais simples.

Não tente ler todos os tutoriais de mônadas com metáforas engraçadas. Eles só vão te misturar ainda pior.

Eu sugeriria aderir ao canal #haskell irc e fazer perguntas lá. Foi assim que aprendi Haskell. Se você passar pelo Mundo Real de Haskell, como sugerido acima, as respostas em tempo real às suas perguntas ajudarão bastante. Muitas pessoas inteligentes no #haskell escrevem o Haskell por diversão e por lucro, então você terá muita informação boa. Tente!

Estes são meus favoritos

Haskell: Programação Funcional com Tipos

 Joeri van Eekelen, et al. | Wikibooks Published in 2012, 597 pages 

Mundo real Haskell

  B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc. Published in 2008, 710 pages 

Eu também posso recomendar Yet Another Haskell Tutorial como uma introdução.

Outro bom recurso de aprendizado (provavelmente no nível intermediário), que me ajudou muito e não foi mencionado nas outras respostas até onde eu posso ver, é o Typeclassopedia de Brent Yorgey, que pode ser encontrado em The Monad Reader (Issue 13)

Está escrito em um estilo muito acessível e contém (entre muitas outras coisas), o seguinte conselho introdutório:

Existem duas chaves para a sabedoria de um hacker especialista em Haskell:

  1. Entenda os tipos.

  2. Obtenha uma profunda intuição para cada tipo de class e seu relacionamento com outras classs de tipos, apoiados por familiaridade com muitos exemplos.

O próprio Monad Reader é um tesouro absoluto para programadores funcionais (não apenas programadores de Haskell).

Tente escrever programas fáceis nele.

Você pode encontrar tarefas de amostra em vários livros didáticos, provavelmente.

Eu não recomendaria aderir aos livros Haskell / FP, apenas tente fazer coisas simples com ele: cálculos, manipulações de strings, access a arquivos.

Depois que eu resolvi uma dúzia, eu quebrei o gelo 🙂

Depois disso, leia muito sobre conceitos avançados (Monads, Arrows, IO, estruturas de dados recursivas), porque haskell é infinito e há muitos deles.

Eu acho que perceber o recurso de Haskell por exemplos é a melhor maneira de começar acima de tudo.

http://en.wikipedia.org/wiki/Haskell_98_features

Aqui estão tipeclasss complicados, incluindo mônadas e flechas

http://www.haskell.org/haskellwiki/Typeclassopedia

para problemas do mundo real e projetos maiores, lembre-se dessas tags: GHC (compilador mais usado), Hackage (libraryDB), Cabal (sistema de construção), darcs (outro sistema de construção).

Um sistema integrado pode economizar seu tempo: http://hackage.haskell.org/platform/

o database de pacotes para este sistema: http://hackage.haskell.org/

Wiki do compilador do GHC: http://www.haskell.org/haskellwiki/GHC

Depois de Haskell_98_features e Typeclassopedia, eu acho que você já pode encontrar e ler a documentação sobre eles

A propósito, você pode querer testar a extensão de algumas línguas do GHC, que pode ser uma parte do padrão haskell no futuro.

Esta é a minha melhor maneira de aprender haskell. Eu espero que isso possa te ajudar.

Eu sugiro que você comece primeiro lendo o tutorial do BONUS , e então lendo o Real World Haskell (online de graça) . Participe do canal de IRC #Haskell, em irc.freenode.com , e faça perguntas. Essas pessoas são absolutamente amigáveis, e me ajudaram muito ao longo do tempo. Além disso, aqui mesmo no SO é um ótimo lugar para obter ajuda com coisas que você não consegue entender! Tente não desanimar, uma vez que clica, sua mente será queimada.

O tutorial do BONUS irá preparar você e prepará-lo para o passeio emocionante que o Real World Haskell oferece. Eu te desejo sorte!

Se você só tem experiência com linguagens imperativas / OO, sugiro usar uma linguagem funcional mais convencional como um trampolim. Haskell é realmente diferente e você tem que entender muitos conceitos diferentes para chegar a algum lugar. Eu sugiro abordar uma linguagem no estilo ML (como, por exemplo, F #) primeiro.

A primeira resposta é muito boa. Para chegar ao nível de Especialista, você deve fazer um PhD com alguns dos próprios especialistas.

Eu sugiro que você visite a página do Haskell: http://haskell.org . Lá você tem muito material e muitas referências para as coisas mais atualizadas em Haskell, aprovadas pela comunidade Haskell.