No capítulo 19 de Real World Haskell, muitos dos exemplos falham devido à mudança de Control.Exception
.
Isso me faz pensar que talvez algumas das coisas neste livro estejam obsoletas e não valham mais a pena estudar, afinal já se passaram 6 anos. Minha única outra referência é Aprenda um Haskell para o bem . Embora seja um ótimo livro, é muito mais básico em comparação com RWH.
Alguém que já leu o livro antes pode dar alguns conselhos sobre quais partes dele não são mais relevantes? Especialmente os capítulos na segunda metade do livro, por exemplo, memória transacional de software, programação simultânea, programação de soquete, etc.
EDITAR: trata-se da edição do livro publicado em dezembro de 2008, que é a única edição conhecida até hoje (novembro de 2017)
fonte
Monad
é uma subclasse deApplicative
.Respostas:
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
return
a partirMonad
, de modo que oMonad
exemplo 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
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
null
foi alterado devido à Proposta dobrável-transversal . Muitas outras funções, tais comofoldr
,foldl
e muitos outros que foram previamente definida somente para[a]
noPrelude
foram substituídos por mais geraisFoldable t => t a
variantes.Capítulo 11. Teste e garantia de qualidade
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,
generate
agora usa emGen a
vez deStdGen
e a funcionalidade da antigagenerate
está emTest.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,
Applicative
agora é uma superclasse deMonad
, algo que não foi planejado em 2007.Consulte as notas de versão 7.8.1 .
As
State
/Writer
/Reader
mônadasNo Será que a mônada imobiliária, por favor, levante-se? seção, os autores afirmam
Isso não é mais verdade, porque
State
e seus amigos agora são implementados viaPortanto, eles são definidos por seu transformador de mônada.
Capítulo 17. Interface com C: o FFI
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:
Como
malloc()
deve ser usado comfree()
,new
comdelete
,allocate
comdeallocate
, deve-se sempre usar a função correta.Se uma função externa alocar memória, você também deve usar a função de desalocação que a acompanha.
Capítulo 19. Tratamento de erros
O tratamento de erros mudou completamente de 6.8 para 6.10, mas você já percebeu isso. Melhor ler a documentação .
Capítulo 22. Exemplo Estendido: Programação de Cliente Web
Alguns dos exemplos parecem estar corrompidos. Além disso, existem outras bibliotecas HTTP disponíveis.
Capítulo 25. Criação de perfil e otimização
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.
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.
Capítulo 26. Projeto de biblioteca avançada: construindo um filtro Bloom
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
bindSocket
esClose
, que devem ser substituídas porbind
eclose
(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.Apêndice A. Instalação das bibliotecas GHC e Haskell
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,
stack
está 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
vectors
pacote.Control.Applicative
RWH usa
Control.Applicative
's(<$>)
em vários pontos, mas não explicaControl.Applicative
nada. LYAH e a Typeclassopedia contêm seções sobreApplicative
. Dado queApplicative
é uma superclasse deMonad
(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 doPrelude
, para se certificar de que seus operadores não colidir com<$>
,<*>
entre outros.Lentes
lens
)Bibliotecas de streaming
conduit
)pipes
, incluído nopipes
pacote)Ferramental
stack
, um programa de plataforma cruzada para o desenvolvimento de projetos Haskellghc-mod
, um backend para vim, emacs, Sublime Text e outros editoresExtensões de idioma novas / ausentes e mudanças de GHC
:i ($)
mudou tremendamente)-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
fonte