Ich werde diesen Leitfaden nach Ihrem Können in Haskell bestellen, vom absoluten Anfänger bis zum Experten. Beachten Sie, dass dieser Vorgang viele Monate (Jahre?) Dauert und daher ziemlich lang ist.
Absoluter Anfänger
Erstens ist Haskell zu allem fähig, mit genügend Geschick. Es ist sehr schnell (meiner Erfahrung nach nur hinter C und C ++) und kann für alles verwendet werden, von Simulationen bis hin zu Servern, Guis und Webanwendungen.
Es gibt jedoch einige Probleme, die für einen Anfänger in Haskell einfacher zu schreiben sind als andere. Mathematische Probleme und Listenprozessprogramme sind dafür gute Kandidaten, da sie nur die grundlegendsten Kenntnisse von Haskell erfordern, um schreiben zu können.
Erstens sind einige gute Anleitungen zum Erlernen der Grundlagen von Haskell das Happy Learn Haskell-Tutorial und die ersten 6 Kapitel , in denen Sie ein Haskell lernen . Während Sie diese lesen, ist es eine sehr gute Idee, auch einfache Probleme mit dem zu lösen, was Sie wissen.
Weitere zwei gute Ressourcen sind die Haskell-Programmierung nach ersten Prinzipien und die Programmierung in Haskell . Beide enthalten Übungen für jedes Kapitel, sodass Sie kleine, einfache Probleme haben, die mit den auf den letzten Seiten erlernten übereinstimmen.
Eine gute Liste von Problemen, die Sie ausprobieren sollten, ist die Seite mit den Problemen mit haskell 99 . Diese beginnen sehr einfach und werden im weiteren Verlauf schwieriger. Es ist eine sehr gute Übung, viele davon zu machen, da Sie damit Ihre Fähigkeiten in Rekursion und Funktionen höherer Ordnung üben können. Ich würde empfehlen, alle Probleme zu überspringen, die Zufälligkeit erfordern, da dies in Haskell etwas schwieriger ist. Überprüfen Sie diese SO-Frage, falls Sie Ihre Lösungen mit QuickCheck testen möchten (siehe Zwischenstufe unten).
Sobald Sie einige davon erledigt haben, können Sie einige der Project Euler- Probleme lösen. Diese sind danach sortiert, wie viele Personen sie abgeschlossen haben, was ein ziemlich guter Hinweis auf Schwierigkeiten ist. Diese testen Ihre Logik und Haskell mehr als die vorherigen Probleme, aber Sie sollten immer noch in der Lage sein, die ersten paar zu tun. Ein großer Vorteil von Haskell bei diesen Problemen ist, dass die Größe von Ganzzahlen nicht begrenzt ist. Um einige dieser Probleme zu lösen, ist es hilfreich, die Kapitel 7 und 8 gelesen zu haben, in denen Sie auch ein Haskell lernen.
Anfänger
Danach sollten Sie die Rekursion und Funktionen höherer Ordnung ziemlich gut im Griff haben, also wäre es ein guter Zeitpunkt, um weitere Probleme in der realen Welt zu lösen. Ein sehr guter Ausgangspunkt ist Real World Haskell (Online-Buch, Sie können auch eine Hardcopy kaufen). Ich fand die ersten Kapitel zu schnell zu schnell eingeführt für jemanden, der noch nie eine funktionale Programmierung / Rekursion durchgeführt hat. Mit der Übung, die Sie bei den vorherigen Problemen gehabt hätten, sollten Sie sie jedoch vollkommen verständlich finden.
Das Durcharbeiten der Probleme in diesem Buch ist eine großartige Möglichkeit, um zu lernen, wie man Abstraktionen verwaltet und wiederverwendbare Komponenten in Haskell erstellt. Dies ist wichtig für Benutzer, die an objektorientierte (oo) Programmierung gewöhnt sind, da die normalen oo-Abstraktionsmethoden (oo-Klassen) in Haskell nicht vorkommen (Haskell verfügt über Typklassen, sie unterscheiden sich jedoch stark von oo-Klassen, eher wie oo-Schnittstellen ). Ich halte es nicht für eine gute Idee, Kapitel zu überspringen, da jedes eine Menge neuer Ideen einführt, die in späteren Kapiteln verwendet werden.
Nach einer Weile gelangen Sie zu Kapitel 14, dem Kapitel der gefürchteten Monaden (dum dum dummmm). Fast jeder, der Haskell lernt, hat Probleme, Monaden zu verstehen, da das Konzept so abstrakt ist. Ich kann mir kein Konzept in einer anderen Sprache vorstellen, das so abstrakt ist wie Monaden in der funktionalen Programmierung. Mit Monaden können viele Ideen (z. B. E / A-Operationen, fehlgeschlagene Berechnungen, Analyse usw.) unter einer Idee zusammengefasst werden. Fühlen Sie sich also nicht entmutigt, wenn Sie sie nach dem Lesen des Monadenkapitels nicht wirklich verstehen. Ich fand es nützlich, viele verschiedene Erklärungen von Monaden zu lesen; Jeder gibt eine neue Perspektive auf das Problem. Hier ist eine sehr gute Liste von Monaden-Tutorials . Ich kann die All About Monads nur empfehlen , aber die anderen sind auch gut.
Außerdem dauert es eine Weile, bis sich die Konzepte wirklich durchsetzen. Dies geschieht durch die Verwendung, aber auch durch die Zeit. Ich finde, dass manchmal das Schlafen bei einem Problem mehr als alles andere hilft! Irgendwann wird die Idee klicken und Sie werden sich fragen, warum Sie Schwierigkeiten hatten, ein Konzept zu verstehen, das in Wirklichkeit unglaublich einfach ist. Es ist großartig, wenn dies passiert, und wenn dies der Fall ist, ist Haskell möglicherweise Ihre bevorzugte Programmiersprache :)
Um sicherzustellen, dass Sie das Haskell-System perfekt verstehen, sollten Sie versuchen, 20 Zwischen-Haskell-Übungen zu lösen . Diese Übungen verwenden unterhaltsame Namen von Funktionen wie "pelzig" und "Banane" und helfen Ihnen, einige grundlegende funktionale Programmierkonzepte gut zu verstehen, wenn Sie sie noch nicht haben. Schöne Art, den Abend mit einem Bündel Papieren zu verbringen, die mit Pfeilen, Einhörnern, Würstchen und pelzigen Bananen bedeckt sind.
Mittlere
Sobald Sie Monaden verstanden haben, haben Sie wahrscheinlich den Übergang von einem Anfänger-Haskell-Programmierer zu einem fortgeschrittenen Haskeller geschafft. Wohin also von hier aus? Das erste, was ich empfehlen würde (wenn Sie sie noch nicht aus dem Erlernen von Monaden gelernt haben), sind die verschiedenen Arten von Monaden, wie z. B. Reader, Writer und State. Auch hier berichten Real World Haskell und All about Monads ausführlich darüber. Um Ihr Monadentraining abzuschließen, ist das Erlernen von Monadentransformatoren ein Muss. Mit diesen können Sie verschiedene Arten von Monaden (z. B. eine Reader- und eine State-Monade) zu einer kombinieren. Dies mag zunächst nutzlos erscheinen, aber nachdem Sie sie eine Weile benutzt haben, werden Sie sich fragen, wie Sie ohne sie gelebt haben.
Jetzt können Sie das reale Haskell-Buch fertigstellen, wenn Sie möchten. Das Überspringen von Kapiteln spielt jetzt keine Rolle mehr, solange Sie Monaden haben. Wählen Sie einfach, was Sie interessiert.
Mit dem Wissen, das Sie jetzt haben würden, sollten Sie in der Lage sein, die meisten Pakete auf cabal (zumindest die dokumentierten ...) sowie die meisten Bibliotheken, die mit Haskell geliefert werden, zu verwenden. Eine Liste interessanter Bibliotheken zum Ausprobieren wäre:
Parsec : zum Parsen von Programmen und Text. Viel besser als die Verwendung von regulären Ausdrücken. Hervorragende Dokumentation, hat auch ein reales Haskell-Kapitel.
QuickCheck : Ein sehr cooles Testprogramm. Sie schreiben ein Prädikat, das immer wahr sein sollte (z length (reverse lst) == length lst
. B. ). Anschließend übergeben Sie dem Prädikat den QuickCheck und es werden viele zufällige Werte (in diesem Fall Listen) generiert und getestet, ob das Prädikat für alle Ergebnisse wahr ist. Siehe auch das Online-Handbuch .
HUnit : Unit-Test in Haskell.
gtk2hs : Mit dem beliebtesten GUI-Framework für Haskell können Sie gtk-Anwendungen in Haskell schreiben.
Happstack : Ein Webentwicklungs-Framework für Haskell. Verwendet keine Datenbanken, sondern einen Datentypspeicher. Ziemlich gute Dokumente (andere beliebte Frameworks wären Snap und Yesod ).
Es gibt auch viele Konzepte (wie das Monadenkonzept), die Sie eventuell lernen sollten. Dies ist einfacher als das erste Mal Monaden zu lernen, da Ihr Gehirn daran gewöhnt ist, mit dem Grad der Abstraktion umzugehen. Ein sehr guter Überblick über diese hochrangigen Konzepte und deren Zusammenspiel ist die Typeclassopedia .
Anwendbar: Eine Schnittstelle wie Monaden, aber weniger leistungsfähig. Jede Monade ist anwendbar, aber nicht umgekehrt. Dies ist nützlich, da es einige Typen gibt, die anwendbar sind, aber keine Monaden. Außerdem ist Code, der mit den anwendbaren Funktionen geschrieben wurde, häufig zusammensetzbarer als das Schreiben des entsprechenden Codes mit den Monad-Funktionen. Weitere Informationen finden Sie unter Functors , Applicative Functors und Monoids .
Faltbar , Travers : Typeclasses dass abstrakt viele der Operationen von Listen, so dass die gleichen Funktionen können auf andere Behältertypen angewandt werden. Siehe auch die Erklärung zum Haskell-Wiki .
Monoid : Ein Monoid ist ein Typ mit einem Wert von Null (oder einem leeren Wert) und einer notierten Operation, <>
die zwei Monoide miteinander verbindet, so dass x <> mempty = mempty <> x = x
und x <> (y <> z) = (x <> y) <> z
. Diese werden als Identitäts- und Assoziativitätsgesetze bezeichnet. Viele Typen sind Monoide wie Zahlen mit mempty = 0
und <> = +
. Dies ist in vielen Situationen nützlich.
Pfeile : Pfeile sind eine Möglichkeit, Berechnungen darzustellen, die eine Eingabe annehmen und eine Ausgabe zurückgeben. Eine Funktion ist der grundlegendste Pfeiltyp, es gibt jedoch viele andere Typen. Die Bibliothek hat auch viele sehr nützliche Funktionen zum Bearbeiten von Pfeilen - sie sind sehr nützlich, selbst wenn sie nur mit einfachen alten Haskell-Funktionen verwendet werden.
Arrays : Die verschiedenen veränderlichen / unveränderlichen Arrays in Haskell.
ST-Monade : Ermöglicht das Schreiben von Code mit einem veränderlichen Status, der sehr schnell ausgeführt wird und dennoch außerhalb der Monade rein bleibt. Weitere Informationen finden Sie unter dem Link.
FRP: Functional Reactive Programming, eine neue, experimentelle Methode zum Schreiben von Code, die Ereignisse, Trigger, Ein- und Ausgänge (z. B. eine GUI) verarbeitet. Ich weiß allerdings nicht viel darüber. Paul Hudaks Vortrag über Yampa ist ein guter Anfang.
Es gibt viele neue Sprachfunktionen, die Sie sich ansehen sollten. Ich werde sie nur auflisten , Sie können viele Informationen über sie von Google, dem haskell-Wikibook , der haskellwiki.org-Site und der ghc-Dokumentation finden .
- Multiparameter-Typklassen / funktionale Abhängigkeiten
- Typ Familien
- Existenziell quantifizierte Typen
- Phantomtypen
- GADTS
- Andere...
Ein Großteil von Haskell basiert auf der Kategorietheorie , daher sollten Sie sich das ansehen. Ein guter Ausgangspunkt ist die Kategorietheorie für Informatiker . Wenn Sie das Buch nicht kaufen möchten, ist auch der Artikel des Autors hervorragend.
Schließlich möchten Sie mehr über die verschiedenen Haskell-Tools erfahren. Diese beinhalten:
- ghc (und alle seine Funktionen)
- Kabale : das Haskell-Paketsystem
- darcs : ein in Haskell geschriebenes verteiltes Versionskontrollsystem, das für Haskell-Programme sehr beliebt ist.
- Schellfisch : ein automatischer Dokumentationsgenerator von Haskell
Während Sie all diese neuen Bibliotheken und Konzepte lernen, ist es sehr nützlich, ein mittelgroßes Projekt in Haskell zu schreiben. Es kann alles sein (zB ein kleines Spiel, ein Datenanalysator, eine Website, ein Compiler ). Wenn Sie daran arbeiten, können Sie viele der Dinge anwenden, die Sie gerade lernen. Du bleibst ewig auf diesem Niveau (hier bin ich).
Experte
Es wird Jahre dauern, bis Sie dieses Stadium erreicht haben (Hallo ab 2009!), Aber von hier aus beginnen Sie vermutlich, Doktorarbeiten, neue ghc-Erweiterungen und neue Abstraktionen zu schreiben.
Hilfe bekommen
Schließlich gibt es in jeder Lernphase mehrere Orte, an denen Informationen abgerufen werden können. Diese sind:
- der #haskell irc kanal
- die Mailinglisten . Es lohnt sich, sich anzumelden, um die Diskussionen zu lesen - einige sind sehr interessant.
- andere Orte auf der Homepage von haskell.org
Fazit
Nun, das stellte sich länger heraus als ich erwartet hatte ... Wie auch immer, ich denke, es ist eine sehr gute Idee, Haskell zu beherrschen. Es dauert lange, aber das liegt hauptsächlich daran, dass Sie dadurch eine völlig neue Denkweise lernen. Es ist nicht so, als würde man Ruby nach dem Erlernen von Java lernen, sondern als würde man Java nach dem Erlernen von C lernen. Außerdem stelle ich fest, dass sich meine objektorientierten Programmierkenntnisse durch das Erlernen von Haskell verbessert haben, da ich viele neue Möglichkeiten sehe, Ideen zu abstrahieren.