Quali parti di Real World Haskell sono ormai obsolete o considerate cattive pratiche?

Nel capitolo 19 di Real World Haskell molti degli esempi ora falliscono a causa del cambio di Control.Exception .

Questo mi fa pensare che forse alcune delle cose in questo libro sono effettivamente obsolete e non vale la pena studiarle più, dopo tutto sono passati 6 anni. Il mio unico altro riferimento è Learn You a Haskell per Great Good , anche se è un grande libro, è molto più semplice rispetto a RWH.

Chiunque abbia letto prima il libro può dare qualche consiglio su quali parti non sono più rilevanti? Soprattutto i capitoli nella seconda parte del libro, ad esempio, memoria transazionale del software, programmazione concorrente, programmazione socket, ecc.

EDIT: Si tratta dell’edizione del libro che è stato pubblicato nel dicembre 2008, che è l’unica edizione conosciuta a partire da oggi (novembre 2017)

Principale problema di RWH

È vecchio. RWH è stato scritto in un momento in cui veniva utilizzata la versione 6.8 di GHC. 6.8 usato versione base 3.0.xx 6.10.1 già utilizzato 4.0.0.0, che ha introdotto molte modifiche . E questo è solo il salto dal 6,8 al 6,10. La versione attuale di GHC è 7.10. Le Monade sono state cambiate Al momento c’è una discussione per rimuovere il return da Monad , quindi l’istanza Monad in Real World Haskell sarà davvero fuori sincronia con il mondo reale.

Detto questo, è ancora una risorsa utile per le linee guida generali. Ma tieni presente che molte librerie sono cambiate dal suo rilascio.

Qualcosa che puoi leggere mentre leggi RWH è “Quello che vorrei sapere durante l’apprendimento di Haskell” di Stephen Diehl . Fornisce ulteriori informazioni, ma attenzione, alcune sezioni non sono realmente amichevoli per i nuovi arrivati.

Revisione generale

  • Leggi i commenti. Di solito contengono informazioni sul fatto che il paragrafo / sezione sia ancora pertinente e / o funzionante.
  • Leggi la documentazione delle librerie / funzioni che vuoi usare. Anche se sei pigro, conosci almeno i tipi.

Commenti ai capitoli

Questa è solo una rapida panoramica di alcune delle cose che ho notato durante la lettura di RWH. Probabilmente è incompleto.

Capitolo 2. Tipi e funzioni rispetto all’FTP

Dal momento che GHC 7.10 .

Il tipo di null è stato modificato a causa della Foldable-Traversable-Proposal . Molte altre funzioni come foldl , foldl e molte altre precedentemente definite solo per [a] nel Prelude sono state sostituite con più generali varianti Foldable t => ta .

Capitolo 11. Test e garanzia della qualità

Dalla piattaforma Haskell 2010 o alla fine del 2008.

Sebbene questo sia menzionato in una nota a piè di pagina , la libreria QuickCheck è cambiata in molti modi, dalla versione 1 alla versione 2. Ad esempio, generate ora utilizza Gen a anziché StdGen e la funzionalità del vecchio generate è in Test.QuickCheck.Gen.unGen .

Nel dubbio, controlla la documentazione .

Capitolo 14. Monadi e capitolo 15. Programmazione con le monadi

Codebreak: Applicative m => Monad m

A partire da GHC 7.10, Applicative ora è una superclass di Monad , qualcosa che non è stato pianificato nel 2007.

In GHC 7.10, Applicative diventerà una superclass di Monad , potenzialmente rompendo un sacco di codice utente. Per facilitare questa transizione, GHC genera ora degli avvertimenti quando le definizioni sono in conflitto con la Proposta Applicativo-Monade ( AMP ).

Vedi 7.8.1 note di rilascio .

Le monade State / Writer / Reader

Nel testamento la monade dello stato reale per favore si alza? sezione, sostengono gli autori

Per definire un’istanza Monad , dobbiamo fornire un costruttore di tipo corretto e definizioni per (>>=) e return . Questo ci porta alla vera definizione di State .

 -- file: ch14/State.hs newtype State sa = State runState :: s -> (a, s) } 

Non è più vero, perché ora lo State e i suoi amici sono implementati tramite

 type State s = StateT s Identity type Writer w = WriterT w Identity type Reader r = ReaderT r Identity 

Quindi sono definiti dal loro trasformatore monade.

Capitolo 17. Interfaccia con C: la FFI

Il capitolo generale va bene, ma come si può leggere nei commenti o sul blog di Yuras Shumovich , la parte del finalizzatore nel codice seguente è una ctriggers pratica:

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

Siccome malloc() dovrebbe essere usato con free() , new con delete , allocate con deallocate , si dovrebbe sempre usare la funzione corretta.

TL; DR Dovresti sempre liberare memoria con lo stesso allocatore che lo ha assegnato per te.

Se una funzione straniera alloca memoria, è necessario utilizzare anche la funzione di deallocazione di accompagnamento.

Capitolo 19. Gestione degli errori

La gestione degli errori è cambiata completamente da 6.8 a 6.10, ma l'hai già notato. Meglio leggere la documentazione .

Capitolo 22. Esempio esteso: programmazione client Web

Alcuni esempi sembrano rotti. Inoltre, ci sono altre librerie HTTP disponibili.

Capitolo 25. Profilazione e ottimizzazione

Le tecniche generali di profilazione sono sempre le stesse e l'esempio (vedi sotto) è un ottimo caso di studio per problemi che possono verificarsi nel tuo programma. Ma a RWH manca la profilatura multi-thread, ad es. Tramite ThreadScope. Inoltre, IO pigro non è interessato a tutto il libro, per quanto ne so.

 mean :: [Double] -> Double mean xs = sum xs / fromIntegral (length xs) 

Capitolo 24 e capitolo 28 (Programmazione simultanea e parallela e STM)

Mentre Capitolo 24. Programmazione simultanea e multicore e Capitolo 28. La memoria transazionale del software è ancora rilevante, il libro di Simon Marlow Parallel e Concurrent Programming in Haskell si concentra esclusivamente sulla programmazione simultanea e parallela ed è piuttosto recente (2013). Programmazione GPU e repa sono completamente mancanti in RWH.

Capitolo 26. Design avanzato della libreria: creazione di un filtro Bloom

Come per gli altri capitoli, le linee guida generali della biblioteca di progettazione sono ancora ben scritte e pertinenti. Tuttavia, a causa di alcuni cambiamenti (?) Riguardanti ST , il risultato non può più essere compilato.

Capitolo 27. Programmazione di rete

È ancora per lo più aggiornato. Dopo tutto, la programmazione di rete non cambia così facilmente. Tuttavia, il codice utilizza le funzioni deprecate bindSocket e sClose , che dovrebbero essere sostituite da bind e close (preferibilmente tramite importazione qualificata). Tieni presente che si tratta di un livello molto basso, potresti voler utilizzare una libreria di alto livello più specializzata.

Appendice A. Installazione delle librerie GHC e Haskell

GHC 6.8 era l'ultima versione prima che la piattaforma Haskell fosse stata introdotta. Pertanto, l'appendice ti dice di ottenere GHC e Cabal a mano. Non farlo. Invece, segui le istruzioni sulla pagina di download di haskell.org.

Inoltre, l'appendice non ti dice delle sandbox Cabal, che sono state introdotte nella Cabal 1.18 e ti liberano dall'inferno delle dipendenze . E, naturalmente, lo stack manca completamente.

Contenuto mancante

Alcuni argomenti non sono affatto discussi in RWH. Ciò include le librerie di streaming come tubi e conduit e anche gli obiettivi .

Ci sono diverse risorse là fuori per questi argomenti, ma qui ci sono alcuni link alle introduzioni per darti un'idea di cosa stanno parlando. Inoltre, se si desidera utilizzare i vettori, utilizzare il pacchetto di vectors .

Control.Applicative

RWH utilizza Control.Applicative 's (<$>) in diversi punti, ma non spiega affatto Control.Applicative . LYAH e la Typeclassopedia contengono sezioni su Applicative . Dato che Applicative è una superclass di Monad (vedi sopra), si raccomanda di imparare quella lezione a memoria.

Inoltre, diversi operatori di Control.Applicative (e la stessa class di tipizzazione) fanno ora parte del Prelude , quindi assicurati che i tuoi operatori non entrino in conflitto con <$> , <*> e altri.

lenti

  • Video di Edward Kmett (autore di lens )
  • Video di Adam Gundry "Lenti: accesso e manipolazione dei dati compositivi"
  • Introduzione e tutorial di Jakub Arnold

Librerie streaming

  • Panoramica sui conduit di Michael Snoyman (autore di conduit )
  • Tutorial di Pipes di Gabriel Gonzales (autore di pipes , incluso nel pacchetto pipes )

Tooling

  • versione 1.18 di Cabal, che ha introdotto sandbox
  • stack , un programma multipiattaforma per lo sviluppo di progetti Haskell
  • ghc-mod , un backend per vim, emacs, Sublime Text e altri editor

Nuove estensioni della lingua / mancanti e modifiche GHC

  • il polimorfismo del tipo runtime ( :i ($) è cambiato tremendamente)
  • -XTypeInType
  • -XDataKinds
  • -XGADT
  • -XRankNTypes
  • -XGenericNewtypeDeriving
  • -XDeriveFunctor
  • qualsiasi altra estensione verificatasi dopo 6.6