Welche Teile von Real World Haskell sind jetzt veraltet oder gelten als schlechte Praxis?

107

In Kapitel 19 von Real World Haskell scheitern viele Beispiele jetzt an der Änderung von Control.Exception.

Das lässt mich denken, dass einige der Dinge in diesem Buch tatsächlich veraltet sind und es nicht mehr wert sind, studiert zu werden, schließlich sind es 6 Jahre. Meine einzige andere Referenz ist Learn You a Haskell For Great Good , obwohl es ein großartiges Buch ist, ist es im Vergleich zu RWH viel grundlegender.

Kann jemand, der das Buch schon einmal gelesen hat, bitte einen Rat geben, welche Teile davon nicht mehr relevant sind? Insbesondere die Kapitel in der zweiten Hälfte des Buches, zum Beispiel Software-Transaktionsspeicher, gleichzeitige Programmierung, Socket-Programmierung usw.

BEARBEITEN: Hier geht es um die Ausgabe des Buches, das im Dezember 2008 veröffentlicht wurde. Dies ist die einzige bekannte Ausgabe ab heute (November 2017).

schwang
quelle
2
AFAIK, die Online-Version von Real World Haskell, wird von Zeit zu Zeit aktualisiert. Vielleicht finden Sie weitere nützliche Informationen im Haskell Wikibook .
Vektorweg
@Vektorweg Die meisten Arbeiten am Wikibook wurden bisher in den Einführungskapiteln (die ungefähr den gleichen Grund wie das LYAH-Niveau abdecken, allerdings mit einer anderen Einstellung) und in der Berichterstattung über fortgeschrittenere theoretische und typsystembezogene Themen durchgeführt. Für angewandte Themen, auf die in den späteren Kapiteln von RWH swang Bezug genommen wird, ist RWH vorerst eine bessere Wahl. Obwohl ich als Wikibook-
Autor
1
@Vektorweg: Ich habe keine signifikanten Unterschiede zwischen der Print- und der Online-Version festgestellt. Außerdem scheint die Online-Version überhaupt nicht aktualisiert zu werden, das Kapitel über den Bloom-Filter ist seit langem (mindestens 2009) unterbrochen. Davon abgesehen Wikibooks, yay :).
Zeta
1
@ Swang Beachten Sie, dass sogar Learn You a Haskell veraltete Dinge enthält, jetzt Monadist das eine Unterklasse von Applicative.
Jub0bs
1
Bitte erwähnen Sie die Ausgabe des Buches. Erwähnen Sie im Allgemeinen immer Version , Plattform , Betriebssystem , Edition usw., wenn Sie über ein Produkt sprechen!
Nawaz

Antworten:

137

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 , returnausMonad 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 nullwurde 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 ersetztfoldrfoldl[a]PreludeFoldable t => t a Varianten.

Kapitel 11. Prüfung und Qualitätssicherung

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 generatejetzt Gen aanstelle von verwendet StdGen, und die Funktionalität der alten generateist 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 Applicativeist jetzt eine Superklasse von Monad, etwas, das 2007 nicht geplant war.

In GHC 7.10 Applicativewird 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/ ReaderMonaden

In der Will die echte Staatsmonade bitte aufstehen? Abschnitt, behaupten die Autoren

Um eine MonadInstanz 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 Stateund 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.

Kapitel 17. Schnittstelle zu C: der FFI

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(), newmit delete, allocatemit deallocatesollte 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.

Kapitel 19. Fehlerbehandlung

Die Fehlerbehandlung wurde vollständig von 6.8 auf 6.10 geändert, aber das haben Sie bereits bemerkt. Lesen Sie besser die Dokumentation .

Kapitel 22. Erweitertes Beispiel: Web Client-Programmierung

Einige der Beispiele scheinen gebrochen zu sein. Es sind auch andere HTTP-Bibliotheken verfügbar.

Kapitel 25. Profilerstellung und Optimierung

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.

Kapitel 26. Erweitertes Bibliotheksdesign: Erstellen eines Bloom-Filters

Wie in den anderen Kapiteln sind die allgemeinen Richtlinien der Designbibliothek immer noch gut geschrieben und relevant. Aufgrund einiger Änderungen (?) STKann 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 bindSocketund sClose, die durch bindund 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.

Anhang A. Installieren von GHC- und Haskell-Bibliotheken

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

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 Applicativeeine 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
Zeta
quelle
danke, das ist genau das, wonach ich gesucht habe :), du erinnerst mich an das Problem der staatlichen Monade, es hat keinen Konstruktor für den staatlichen Wert mehr, ich musste mich am Kopf kratzen, um herauszufinden, wann ich es gelesen habe.
Swang
@ Swang: Es ist noch lange nicht vollständig. Vielleicht wissen Bryan oder Don mehr über geänderte Funktionen. In beiden Fällen gelten weiterhin die allgemeinen Richtlinien.
Zeta
1
Für High-Level-Netzwerke bevorzuge ich netzwerkfreundlich .
Lambda Fairy
Es gibt eine Beziehung zwischen "Wandlern", Coroutinen und den Rohrleitungen der Streaming-Bibliotheken.
CMCDragonkai
Wird die Verwendung von HDBC als veraltet angesehen?
Janus Troelsen