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 o Monad
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
- 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 null
foi alterado devido à Proposta dobrável-transversal . Muitas outras funções, tais como foldr
, foldl
e muitos outros que foram previamente definida somente para [a]
no Prelude
foram substituídos por mais gerais Foldable t => t a
variantes.
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 em Gen a
vez de StdGen
e a funcionalidade da antiga generate
está 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, Applicative
agora é uma superclasse de Monad
, algo que não foi planejado em 2007.
No GHC 7.10, Applicative
ele 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
/ Reader
mônadas
No Será que a mônada imobiliária, por favor, levante-se? seção, os autores afirmam
Para definir uma Monad
instâ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 State
e 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()
, new
com delete
, allocate
com 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 bindSocket
e sClose
, que devem ser substituídas por bind
e 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, 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 explica Control.Applicative
nada. 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