Quais partes do Real World Haskell estão obsoletas ou são consideradas práticas inadequadas?

107

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)

swang
fonte
2
AFAIK a versão online do Real World Haskell será atualizada de tempos em tempos. Talvez você encontre coisas mais úteis no Wikibook de Haskell .
Vektorweg
@Vektorweg A maior parte do trabalho no Wikibook até agora foi feita nos capítulos introdutórios (que cobrem aproximadamente o mesmo nível do nível LYAH, embora com uma abordagem diferente) e na cobertura de tópicos mais avançados de teoria e sistema de tipos. Para questões aplicadas, como visto nos capítulos posteriores de RWH que swang se refere, RWH é uma escolha melhor por enquanto; mesmo assim, como um contribuidor do Wikibook, espero que isso mude eventualmente :)
duplode
1
@Vektorweg: Não notei diferenças significativas entre a versão impressa e a online. Além disso, a versão online não parece ser atualizada, o capítulo do filtro bloom está quebrado há muito tempo (pelo menos 2009). Dito isso, Wikibooks, yay :).
Zeta de
1
@Swang Observe que até mesmo Aprenda um Haskell contém coisas obsoletas, agora isso Monadé uma subclasse de Applicative.
jub0bs
1
Por favor, mencione a edição do livro. Em geral, sempre mencione a versão , plataforma , sistema operacional , edição etc. quando falar sobre um produto!
Nawaz

Respostas:

137

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.

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, 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.

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:

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.

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.

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.

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 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.

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, 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
Zeta
fonte
obrigado, isso é exatamente o que eu estava procurando :), você me lembra da questão da mônada estadual, ela não tem mais um construtor de valor State, levei um pouco de esforço para descobrir quando eu estava lendo.
swang de
@swang: Ainda está longe de estar completo. Talvez Bryan ou Don saibam mais sobre os recursos alterados. De qualquer forma, as diretrizes gerais ainda se aplicam.
Zeta de
1
Para rede de alto nível, prefiro rede simples .
Lambda Fairy
Há uma relação entre "transdutores", corrotinas e os tubos de bibliotecas de streaming, conduíte.
CMCDragonkai
O uso de HDBC é considerado desatualizado?
Janus Troelsen de