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 return
dalMonad
, in modo che il Monad
caso 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
, foldl
e molte altre che in precedenza erano definite solo per [a]
in Prelude
sono state sostituite con Foldable t => t a
varianti più generali .
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, generate
ora utilizza Gen a
invece di StdGen
e 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, Applicative
diventerà 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 Monad
un'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é State
e 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.
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()
, new
con delete
, allocate
con 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.
La gestione degli errori è cambiata completamente da 6.8 a 6.10, ma l'hai già notato. Meglio leggere la documentazione .
Alcuni degli esempi sembrano essere infranti. Inoltre, sono disponibili altre librerie HTTP.
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.
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 bindSocket
e sClose
, che dovrebbero essere sostituite da bind
e close
(preferibilmente tramite importazione qualificata). Tieni presente che è di livello molto basso, potresti voler utilizzare una libreria di alto livello più specializzata.
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, stack
manca 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 vectors
pacchetto.
Control.Applicative
RWH usa Control.Applicative
's (<$>)
in diversi punti, ma non spiega Control.Applicative
affatto. 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