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


107

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

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

Chi ha già letto il libro può dare qualche consiglio su quali parti di esso non sono più rilevanti? Soprattutto i capitoli nella seconda metà del libro, ad esempio, memoria transazionale software, programmazione concorrente, programmazione socket, ecc.

EDIT: Si tratta dell'edizione del libro pubblicato a dicembre 2008, che è l'unica edizione conosciuta ad oggi (novembre 2017)


2
AFAIK la versione online di Real World Haskell verrà aggiornata di volta in volta. Forse trovi cose più utili nel Wikibook Haskell .
Vektorweg

@Vektorweg La maggior parte del lavoro su Wikibook fino ad ora è stato svolto nei capitoli introduttivi (che coprono più o meno lo stesso livello del livello LYAH, sebbene con un approccio diverso) e nella copertura di argomenti più avanzati sulla teoria e sul sistema dei tipi. Per le questioni applicate, come si è visto nei capitoli successivi di RWH swang si riferisce, RWH è una scelta migliore per ora; anche se, come collaboratore di Wikibook, spero che alla fine cambierà :)
duplode

1
@Vektorweg: non ho notato differenze significative tra la versione cartacea e quella online. Inoltre, la versione online non sembra essere aggiornata affatto, il capitolo del filtro bloom è stato interrotto per molto tempo (almeno nel 2009). Detto questo, Wikibooks, yay :).
Zeta

1
@Swang Nota che anche Learn You a Haskell contiene roba obsoleta, ora che Monadè una sottoclasse di Applicative.
jub0bs

1
Si prega di menzionare l' edizione del libro. In generale, menziona sempre la versione , la piattaforma , il sistema operativo , l' edizione ecc. Quando parli di un prodotto!
Nawaz

Risposte:


137

Problema principale di RWH

È vecchio. RWH è stato scritto mentre veniva utilizzata la versione 6.8 di GHC. 6.8 utilizzava la versione base 3.0.xx 6.10.1 già utilizzava 4.0.0.0, che ha introdotto molte modifiche . E questo è solo il salto da 6.8 a 6.10. La versione corrente di GHC è 7.10. Le monadi sono state cambiate. C'è attualmente una discussione per rimuovere returndalMonad , in modo che il Monadcaso 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 quando imparo Haskell" di Stephen Diehl . Fornisce ulteriori informazioni, ma tieni presente che alcune sezioni non sono molto adatte ai nuovi arrivati.

Revisione generale

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

Osservazioni 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 vs FTP

A partire da GHC 7.10 .

Il tipo di nullè stato modificato a causa della proposta pieghevole-traslabile . Molte altre funzioni come foldr, foldle molte altre che in precedenza erano definite solo per [a]in Preludesono state sostituite con Foldable t => t avarianti più generali .

Capitolo 11. Test e garanzia di qualità

Dalla piattaforma Haskell 2010 o dalla 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, generateora utilizza Gen ainvece di StdGene la funzionalità della vecchia generateè in Test.QuickCheck.Gen.unGen.

In caso di dubbio, controlla la documentazione .

Capitolo 14. Monadi e Capitolo 15. Programmazione con monadi

Rottura del codice: Applicative m => Monad m

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

In GHC 7.10, Applicativediventerà una superclasse di Monad, potenzialmente rompendo un sacco di codice utente. Per facilitare questa transizione, GHC ora genera avvisi quando le definizioni sono in conflitto con la proposta di monade applicativa ( AMP ).

Vedere 7.8.1 note sulla versione .

Le monadi State/ Writer/Reader

Nel Will la monade dello stato reale si alzi per favore? sezione, affermano gli autori

Per definire Monadun'istanza, dobbiamo fornire un costruttore di tipo appropriato così come le definizioni per (>>=)e return. Questo ci porta alla vera definizione di State.

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

Non è più vero, perché Statee i suoi amici sono ora 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. Interfacciamento con C: la FFI

Il capitolo generale va bene, ma come si può leggere nei commenti o sul blog di Yuras Shumovich , la parte finalizzata al seguente codice è una cattiva 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))

Come malloc()dovrebbe essere usato con free(), newcon delete, allocatecon deallocate, si dovrebbe sempre usare la funzione corretta.

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

Se una funzione esterna alloca memoria, è necessario utilizzare anche la funzione di deallocazione associata.

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 degli esempi sembrano essere infranti. Inoltre, sono disponibili altre librerie HTTP.

Capitolo 25. Profilazione e ottimizzazione

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

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

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

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

Capitolo 26. Progettazione avanzata della libreria: creazione di un filtro Bloom

Come per gli altri capitoli, le linee guida generali della libreria di progettazione sono ancora ben scritte e pertinenti. Tuttavia, a causa di alcune modifiche (?) Relative 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 funzioni deprecate bindSockete sClose, che dovrebbero essere sostituite da binde close(preferibilmente tramite importazione qualificata). Tieni presente che è di 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 dell'introduzione della piattaforma Haskell. Pertanto, l'appendice ti dice di ottenere GHC e Cabal a mano. Non farlo. Segui invece le istruzioni sulla pagina di download di haskell.org .

Inoltre, l'appendice non ti parla dei sandbox Cabal, che sono stati introdotti in Cabal 1.18 e ti liberano dall'inferno delle dipendenze . E, naturalmente, stackmanca completamente.

Contenuto mancante

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

Ci sono diverse risorse là fuori per questi argomenti, ma qui ci sono alcuni link alle introduzioni per darti un'idea di cosa si tratta. Inoltre, se vuoi usare i vettori, usa il vectorspacchetto.

Control.Applicative

RWH usa Control.Applicative's (<$>)in diversi punti, ma non spiega Control.Applicativeaffatto. LYAH e Typeclassopedia contengono sezioni su Applicative. Dato che Applicativeè una superclasse di Monad(vedi sopra), si consiglia di imparare quella classe a memoria.

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

Lenti a contatto

Librerie in streaming

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 e modifiche a GHC mancanti

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

grazie, questo è esattamente quello che stavo cercando :), mi ricordi il problema della monade di stato, non ha più un costruttore di valori di stato, mi ci è voluto un po 'di grattarsi la testa per capire mentre lo stavo leggendo.
swang

@swang: è ancora lontano dall'essere completo. Forse Bryan o Don sanno di più sulle funzionalità modificate. Ad ogni modo, le linee guida generali sono ancora valide.
Zeta

1
Per le reti di alto livello, preferisco la semplicità della rete .
Lambda Fairy

Esiste una relazione tra i "trasduttori", le coroutine e i tubi delle librerie di streaming, conduit.
CMCDragonkai

L'uso di HDBC è considerato obsoleto?
Janus Troelsen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.