Questão principal da RWH
É velho. RWH foi escrito no momento em que a versão 6.8 do GHC estava sendo usada. 6.8 usava a versão base 3.0.xx 6.10.1 já usava 4.0.0.0, que introduziu muitas mudanças . E isso é apenas o salto de 6,8 para 6,10. A versão atual do GHC é 7.10. Mônadas foram alteradas. Há atualmente um debate para remover returna partirMonad , de modo que o Monadexemplo na Real World Haskell realmente vai estar fora de sincronia com o mundo real.
Dito isso, ainda é um recurso útil para orientações gerais. Mas tenha em mente que muitas bibliotecas mudaram desde seu lançamento.
Algo que você pode ler enquanto lê RWH é "O que eu gostaria de saber ao aprender Haskell", de Stephen Diehl . Ele fornece uma visão adicional, mas esteja ciente de que algumas seções não são realmente amigáveis para iniciantes.
Observações gerais
- Leia os comentários. Eles geralmente contêm informações se o parágrafo / seção fornecido ainda é relevante e / ou está funcionando.
- Leia a documentação das bibliotecas / funções que deseja usar. Mesmo se você for preguiçoso, conheça pelo menos os tipos.
Observações aos capítulos
Esta é apenas uma visão geral rápida de algumas coisas que observei ao ler RWH. Provavelmente está incompleto.
Capítulo 2. Tipos e funções vs o FTP
Desde GHC 7.10 .
O tipo de nullfoi alterado devido à Proposta dobrável-transversal . Muitas outras funções, tais como foldr, foldle muitos outros que foram previamente definida somente para [a]no Preludeforam substituídos por mais gerais Foldable t => t avariantes.
Desde a plataforma Haskell 2010 ou final de 2008.
Embora isso seja mencionado em uma nota de rodapé , a biblioteca QuickCheck mudou de várias maneiras da versão 1 para a versão 2. Por exemplo, generateagora usa em Gen avez de StdGene a funcionalidade da antiga generateestá em Test.QuickCheck.Gen.unGen.
Em caso de dúvida, verifique a documentação .
Capítulo 14. Mônadas e Capítulo 15. Programação com mônadas
Quebra de código: Applicative m => Monad m
A partir do GHC 7.10, Applicativeagora é uma superclasse de Monad, algo que não foi planejado em 2007.
No GHC 7.10, Applicativeele se tornará uma superclasse de Monad, potencialmente quebrando muitos códigos de usuário. Para facilitar essa transição, o GHC agora gera avisos quando as definições entram em conflito com a Proposta Monad Aplicativa ( AMP ).
Consulte as notas de versão 7.8.1 .
As State/ Writer/ Readermônadas
No Será que a mônada imobiliária, por favor, levante-se? seção, os autores afirmam
Para definir uma Monadinstância, temos que fornecer um construtor de tipo adequado, bem como definições para (>>=)e return. Isso nos leva à verdadeira definição de State.
-- file: ch14/State.hs
newtype State s a = State
runState :: s -> (a, s)
}
Isso não é mais verdade, porque Statee seus amigos agora são implementados via
type State s = StateT s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity
Portanto, eles são definidos por seu transformador de mônada.
O capítulo geral está bom, mas como se pode ler nos comentários ou no blog de Yuras Shumovich , a parte finalizadora no código a seguir é uma prática ruim:
pcre_ptr <- c_pcre_compile pattern (combineOptions flags) errptr erroffset nullPtr
if pcre_ptr == nullPtr
then do
err <- peekCString =<< peek errptr
return (Left err)
else do
reg <- newForeignPtr finalizerFree pcre_ptr -- release with free()
return (Right (Regex reg str))
Como malloc()deve ser usado com free(), newcom delete, allocatecom deallocate, deve-se sempre usar a função correta.
TL; DR Você deve sempre liberar memória com o mesmo alocador que a alocou para você.
Se uma função externa alocar memória, você também deve usar a função de desalocação que a acompanha.
O tratamento de erros mudou completamente de 6.8 para 6.10, mas você já percebeu isso. Melhor ler a documentação .
Alguns dos exemplos parecem estar corrompidos. Além disso, existem outras bibliotecas HTTP disponíveis.
As técnicas gerais de criação de perfil ainda são as mesmas, e o exemplo (veja abaixo) é um ótimo estudo de caso para problemas que podem ocorrer em seu programa. Mas RWH está faltando o perfil multithread, por exemplo, via ThreadScope. Além disso, IO preguiçoso não está preocupado ao longo de todo o livro, pelo que eu sei.
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
Capítulo 24 e Capítulo 28 (Programação simultânea e paralela e STM)
Embora o Capítulo 24. Programação simultânea e multicore e o Capítulo 28. Memória transacional de software ainda sejam relevantes, o livro de Simon Marlow, Parallel and Concurrent Programming in Haskell, concentra-se exclusivamente na programação simultânea e paralela e é bastante recente (2013). A programação e o reparo da GPU estão completamente ausentes no RWH.
Assim como nos outros capítulos, as diretrizes gerais da biblioteca de projetos ainda são bem escritas e relevantes. Porém, devido a algumas alterações (?) Referentes ST, o resultado não pode mais ser compilado.
Capítulo 27. Programação de rede
Ainda está quase sempre atualizado. Afinal, a programação de rede não muda tão facilmente. No entanto, o código usa funções obsoletas bindSockete sClose, que devem ser substituídas por binde close(de preferência por meio de importação qualificada). Lembre-se de que é um nível muito baixo, você pode querer usar uma biblioteca de alto nível mais especializada.
GHC 6.8 era a última versão antes da plataforma Haskell ser introduzida. Portanto, o apêndice diz para você obter GHC e Cabal manualmente. Não. Em vez disso, siga as instruções na página de download do haskell.org .
Além disso, o apêndice não fala sobre caixas de areia Cabal, que foram introduzidas no Cabal 1.18 e libertam você do inferno da dependência . E, claro, stackestá faltando completamente.
Conteúdo ausente
Alguns tópicos não são discutidos no RWH. Isso inclui bibliotecas de streaming, como tubos e conduítes , e também lentes .
Existem vários recursos disponíveis para esses tópicos, mas aqui estão alguns links de introduções para dar a você uma ideia do que eles tratam. Além disso, se você quiser usar vetores, use o vectorspacote.
Control.Applicative
RWH usa Control.Applicative's (<$>)em vários pontos, mas não explica Control.Applicativenada. LYAH e a Typeclassopedia contêm seções sobre Applicative. Dado que Applicativeé uma superclasse de Monad(veja acima), é recomendável aprender essa classe de cor.
Além disso, vários operadores de Control.Applicative(e do próprio typeclass) são agora parte do Prelude, para se certificar de que seus operadores não colidir com <$>, <*>entre outros.
Lentes
Bibliotecas de streaming
Ferramental
- versão 1.18 do Cabal, que introduziu sandboxes
stack, um programa de plataforma cruzada para o desenvolvimento de projetos Haskell
ghc-mod, um backend para vim, emacs, Sublime Text e outros editores
Extensões de idioma novas / ausentes e mudanças de GHC
- polimorfismo de tipo de tempo de execução (
:i ($)mudou tremendamente)
-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
- qualquer outra extensão que aconteceu depois de 6.6