Hauptausgabe von RWH
Es ist alt. RWH wurde zu einem Zeitpunkt geschrieben, als Version 6.8 von GHC verwendet wurde. 6.8 verwendete Basisversion 3.0.xx 6.10.1 verwendete bereits 4.0.0.0, was viele Änderungen einführte . Und das ist nur der Sprung von 6.8 auf 6.10. Die aktuelle Version von GHC ist 7.10. Monaden wurden geändert. Es gibt derzeit eine Diskussion , return
ausMonad
der entfernt werden mussMonad
Instanz in Real World Haskell wirklich synchron mit der realen Welt aus sein wird.
Trotzdem ist es immer noch eine nützliche Ressource für allgemeine Richtlinien. Beachten Sie jedoch, dass sich viele Bibliotheken seit ihrer Veröffentlichung geändert haben.
Was Sie beim Lesen von RWH mitlesen können, ist "Was ich wünschte, ich wüsste es, wenn ich Haskell lerne" von Stephen Diehl . Es bietet zusätzliche Einblicke, aber beachten Sie, dass einige Abschnitte nicht wirklich für Neulinge geeignet sind.
Allgemeine Bemerkungen
- Lesen Sie die Kommentare. Sie enthalten normalerweise Informationen darüber, ob der angegebene Absatz / Abschnitt noch relevant ist und / oder funktioniert.
- Lesen Sie die Dokumentation der Bibliotheken / Funktionen, die Sie verwenden möchten. Auch wenn Sie faul sind, kennen Sie zumindest die Typen.
Anmerkungen zu den Kapiteln
Dies ist nur ein kurzer Überblick über einige Dinge, die mir beim Lesen von RWH aufgefallen sind. Es ist wahrscheinlich unvollständig.
Kapitel 2. Typen und Funktionen im Vergleich zum FTP
Seit GHC 7.10 .
Die Art von null
wurde aufgrund des Vorschlags für faltbare Traversable geändert . Viele weitere Funktionen wie , und viele andere , die bisher nur definiert wurden in die wurden mit allgemeineren ersetztfoldr
foldl
[a]
Prelude
Foldable t => t a
Varianten.
Seit Haskell-Plattform 2010 oder Ende 2008.
Obwohl dies in einer Fußnote erwähnt wird , hat sich die QuickCheck-Bibliothek in vielerlei Hinsicht von Version 1 auf Version 2 geändert. Zum Beispiel wird generate
jetzt Gen a
anstelle von verwendet StdGen
, und die Funktionalität der alten generate
ist in Test.QuickCheck.Gen.unGen
.
Überprüfen Sie im Zweifelsfall die Dokumentation .
Kapitel 14. Monaden & Kapitel 15. Programmieren mit Monaden
Code knacken: Applicative m => Monad m
Ab GHC 7.10 Applicative
ist jetzt eine Superklasse von Monad
, etwas, das 2007 nicht geplant war.
In GHC 7.10 Applicative
wird eine Superklasse von Monad
, möglicherweise viele Benutzercode brechen. Um diesen Übergang zu erleichtern, generiert GHC jetzt Warnungen, wenn Definitionen im Widerspruch zum Vorschlag für eine anwendbare Monade ( AMP ) stehen.
Siehe 7.8.1 Versionshinweise .
Die State
/ Writer
/ Reader
Monaden
In der Will die echte Staatsmonade bitte aufstehen? Abschnitt, behaupten die Autoren
Um eine Monad
Instanz zu definieren , müssen wir einen geeigneten Typkonstruktor sowie Definitionen für (>>=)
und bereitstellen return
. Dies führt uns zur eigentlichen Definition von State
.
-- file: ch14/State.hs
newtype State s a = State
runState :: s -> (a, s)
}
Das stimmt nicht mehr, denn State
und seine Freunde werden jetzt über implementiert
type State s = StateT s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity
Sie werden also durch ihren Monadentransformator definiert.
Das gesamte Kapitel ist in Ordnung, aber wie man in den Kommentaren oder auf Yuras Shumovichs Blog lesen kann , ist der Finalizer-Teil im folgenden Code eine schlechte Praxis:
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))
Wie malloc()
bei free()
, new
mit delete
, allocate
mit deallocate
sollte immer die richtige Funktion verwendet werden.
TL; DR Sie sollten immer Speicher mit demselben Allokator freigeben, der ihn Ihnen zugewiesen hat.
Wenn eine Fremdfunktion Speicher zuweist, sollten Sie auch die zugehörige Freigabefunktion verwenden.
Die Fehlerbehandlung wurde vollständig von 6.8 auf 6.10 geändert, aber das haben Sie bereits bemerkt. Lesen Sie besser die Dokumentation .
Einige der Beispiele scheinen gebrochen zu sein. Es sind auch andere HTTP-Bibliotheken verfügbar.
Die allgemeinen Profilerstellungstechniken sind immer noch dieselben, und das Beispiel (siehe unten) ist eine hervorragende Fallstudie für Probleme, die in Ihrem Programm auftreten können. Bei RWH fehlt jedoch die Multithread-Profilerstellung, z. B. über ThreadScope. Soweit ich weiß, ist Lazy IO nicht im gesamten Buch betroffen.
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
Kapitel 24 & Kapitel 28 (Gleichzeitige und parallele Programmierung & STM)
Während Kapitel 24. Concurrent- und Multicore-Programmierung und Kapitel 28. Software-Transaktionsspeicher immer noch relevant sind, ist Simon Marlows Buch Parallel and Concurrent Programming in Haskell ausschließlich auf Concurrent- und Parallel-Programmierung und ist ziemlich neu (2013). GPU-Programmierung und Repa fehlen in RWH vollständig.
Wie in den anderen Kapiteln sind die allgemeinen Richtlinien der Designbibliothek immer noch gut geschrieben und relevant. Aufgrund einiger Änderungen (?) ST
Kann das Ergebnis jedoch nicht mehr kompiliert werden.
Kapitel 27. Netzwerkprogrammierung
Es ist immer noch meistens auf dem neuesten Stand. Schließlich ändert sich die Netzwerkprogrammierung nicht so leicht. Der Code verwendet jedoch veraltete Funktionen bindSocket
und sClose
, die durch bind
und close
(vorzugsweise durch qualifizierten Import) ersetzt werden sollten. Denken Sie daran, dass es sich um eine sehr niedrige Bibliothek handelt. Möglicherweise möchten Sie eine spezialisiertere Bibliothek auf hoher Ebene verwenden.
GHC 6.8 war die letzte Version vor der Einführung der Haskell-Plattform. Im Anhang erfahren Sie daher, wie Sie GHC und Cabal von Hand erhalten. Tu es nicht. Folgen Sie stattdessen den Anweisungen auf der Download-Seite von haskell.org .
Außerdem enthält der Anhang keine Informationen zu Cabal-Sandkästen, die in Cabal 1.18 eingeführt wurden und Sie von der Abhängigkeitshölle befreien . Und stack
fehlt natürlich komplett.
Fehlender Inhalt
Einige Themen werden in RWH überhaupt nicht behandelt. Dies umfasst Streaming-Bibliotheken wie Pipes und Conduits sowie Objektive .
Es gibt verschiedene Ressourcen für diese Themen, aber hier sind einige Links zu Einführungen, um Ihnen eine Vorstellung davon zu geben, worum es geht. Wenn Sie Vektoren verwenden möchten, verwenden Sie das vectors
Paket.
Control.Applicative
RWH verwendet Control.Applicative
's (<$>)
an mehreren Stellen, erklärt es aber überhaupt nicht Control.Applicative
. LYAH und die Typeclassopedia enthalten Abschnitte über Applicative
. Da dies Applicative
eine Oberklasse von Monad
(siehe oben) ist, wird empfohlen, diese Klasse auswendig zu lernen.
Darüber hinaus mehrere Betreiber von Control.Applicative
(und die selbst typeclass) sind jetzt Teil der Prelude
, so stellen Sie sicher, dass Ihre Mitarbeiter nicht mit tun kollidieren <$>
, <*>
und andere.
Linsen
Streaming-Bibliotheken
Werkzeuge
- Version 1.18 von Cabal, die Sandkästen einführte
stack
, ein plattformübergreifendes Programm zur Entwicklung von Haskell-Projekten
ghc-mod
, ein Backend für Vim, Emacs, Sublime Text und andere Editoren
Neue / fehlende Spracherweiterungen und GHC-Änderungen
- Laufzeit-Polymorphismus (
:i ($)
hat sich enorm verändert)
-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
- jede andere Erweiterung, die nach 6.6 aufgetreten ist