Ich werde diesen Leitfaden nach Ihrem Kenntnisstand in Haskell ordnen, vom absoluten Anfänger bis zum Experten. Beachten Sie, dass dieser Prozess viele Monate (Jahre?) dauern wird, also ist er ziemlich lang.
Absolute Anfängerin
Erstens ist Haskell zu allem fähig, wenn man es gut genug beherrscht. Es ist sehr schnell (meiner Erfahrung nach nur hinter C und C++) und kann für alles von Simulationen bis hin zu Servern, Guis und Webanwendungen verwendet werden.
Es gibt jedoch einige Probleme, die für einen Anfänger in Haskell leichter zu schreiben sind als andere. Mathematische Probleme und Listenprozessprogramme sind gute Kandidaten dafür, da sie nur die grundlegendsten Haskell-Kenntnisse erfordern, um geschrieben werden zu können.
Einige gute Anleitungen zum Erlernen der Grundlagen von Haskell sind die Happy Learn Haskell Tutorial und den ersten 6 Kapiteln von Lernen Sie Haskell für einen guten Zweck (oder seine JupyterLab-Anpassung ). Bei der Lektüre dieser Texte ist es eine gute Idee, auch einfache Probleme mit dem zu lösen, was man weiß.
Zwei weitere gute Quellen sind Haskell-Programmierung von Grund auf und Programmieren in Haskell . Beide enthalten Übungen zu jedem Kapitel, so dass Sie kleine, einfache Aufgaben haben, die dem entsprechen, was Sie auf den letzten Seiten gelernt haben.
Eine gute Liste von Problemen zum Ausprobieren ist die haskell 99 probleme seite . Die Aufgaben sind anfangs sehr einfach und werden im Laufe der Zeit immer schwieriger. Es ist eine sehr gute Übung, viele dieser Aufgaben zu lösen, da Sie damit Ihre Fähigkeiten in Rekursion und Funktionen höherer Ordnung üben können. Ich würde empfehlen, alle Aufgaben, die Zufälligkeit erfordern, zu überspringen, da dies in Haskell etwas schwieriger ist. Prüfen Sie diese SO-Frage für den Fall, dass Sie Ihre Lösungen mit QuickCheck testen wollen (siehe Zwischenbericht unten).
Wenn Sie einige dieser Aufgaben erledigt haben, können Sie einige der folgenden Aufgaben in Angriff nehmen Projekt Euler Probleme. Sie sind danach sortiert, wie viele Leute sie gelöst haben, was ein guter Hinweis auf den Schwierigkeitsgrad ist. Diese stellen Ihre Logik und Haskell mehr auf die Probe als die vorherigen Probleme, aber Sie sollten trotzdem in der Lage sein, die ersten paar zu lösen. Ein großer Vorteil von Haskell bei diesen Aufgaben ist, dass Ganzzahlen nicht in ihrer Größe begrenzt sind. Um einige dieser Aufgaben zu lösen, ist es nützlich, auch die Kapitel 7 und 8 von learn you a Haskell gelesen zu haben.
Anfänger
Danach sollten Sie die Rekursion und Funktionen höherer Ordnung recht gut beherrschen, so dass es an der Zeit wäre, sich mit realitätsnahen Problemen zu beschäftigen. Ein sehr guter Ausgangspunkt dafür ist Haskell in der realen Welt (Online-Buch, Sie können auch ein gedrucktes Exemplar erwerben). Ich fand, dass in den ersten Kapiteln zu schnell zu viel eingeführt wurde für jemanden, der noch nie funktionale Programmierung gemacht oder Rekursionen verwendet hat. Mit der Übung, die man bei der Bearbeitung der vorangegangenen Probleme hat, sollte es jedoch vollkommen verständlich sein.
Die Arbeit an den Problemen in diesem Buch ist eine großartige Möglichkeit zu lernen, wie man mit Abstraktionen umgeht und wiederverwendbare Komponenten in Haskell erstellt. Das ist für Leute, die an objektorientierte (oo) Programmierung gewöhnt sind, von entscheidender Bedeutung, da die normalen oo-Abstraktionsmethoden (oo-Klassen) in Haskell nicht vorkommen (Haskell hat Typklassen, aber die sind ganz anders als oo-Klassen, eher wie oo-Schnittstellen). Ich denke nicht, dass es eine gute Idee ist, Kapitel zu überspringen, da jedes Kapitel eine Menge neuer Ideen einführt, die in späteren Kapiteln verwendet werden.
Nach einer Weile kommen Sie zu Kapitel 14, dem gefürchteten Kapitel über Monaden (dum dum dummmm). Fast jeder, der Haskell lernt, hat Schwierigkeiten, Monaden zu verstehen, weil 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. Monaden erlauben es, viele Ideen (wie IO-Operationen, Berechnungen, die fehlschlagen können, Parsing,...) unter einer Idee zu vereinen. Lassen Sie sich also nicht entmutigen, wenn Sie nach der Lektüre des Kapitels über Monaden diese nicht wirklich verstehen. Ich fand es nützlich, viele verschiedene Erklärungen von Monaden zu lesen; jede gibt eine neue Perspektive auf das Problem. Hier ist eine sehr gute Liste der Monaden-Tutorials . Ich empfehle dringend die Alles über Monaden aber die anderen sind auch gut.
Außerdem dauert es eine Weile, bis man die Konzepte wirklich verstanden hat. Das kommt durch den Gebrauch, aber auch durch die Zeit. Ich finde, manchmal hilft es mehr als alles andere, über einem Problem zu schlafen! Irgendwann macht es dann Klick, und Sie werden sich fragen, warum Sie sich so schwer getan haben, ein Konzept zu verstehen, das in Wirklichkeit unglaublich einfach ist. Es ist großartig, wenn das passiert, und wenn es passiert, werden Sie Haskell vielleicht als Ihre bevorzugte imperative Programmiersprache entdecken :)
Um sicher zu gehen, dass Sie das Haskell-Typensystem perfekt verstehen, sollten Sie versuchen, die Aufgabe 20 Haskell-Übungen für Fortgeschrittene . Diese Übungen verwenden lustige Funktionsnamen wie "Pelz" und "Banane" und helfen Ihnen, einige grundlegende Konzepte der funktionalen Programmierung zu verstehen, falls Sie diese noch nicht kennen. Eine schöne Art, den Abend mit einem Haufen Papiere zu verbringen, die mit Pfeilen, Einhörnern, Würsten und pelzigen Bananen bedeckt sind.
Zwischenbericht
Sobald Sie Monads verstanden haben, haben Sie den Übergang von einem Anfänger-Haskell-Programmierer zu einem fortgeschrittenen Haskell-Programmierer geschafft. Wie geht es nun weiter? Das erste, was ich empfehlen würde (falls Sie es nicht schon durch das Lernen von Monaden gelernt haben), sind die verschiedenen Typen von Monaden, wie Reader, Writer und State. Auch hier gibt es in Real world Haskell und All about monads eine sehr gute Übersicht über diese Themen. Um Ihre Monadenausbildung zu vervollständigen, ist das Lernen über Monadentransformatoren ein Muss. Diese ermöglichen es Ihnen, verschiedene Arten von Monaden (z. B. eine Reader- und State-Monade) zu einer Monade zu kombinieren. Dies mag anfangs nutzlos erscheinen, aber nachdem Sie sie eine Weile benutzt haben, werden Sie sich fragen, wie Sie ohne sie leben konnten.
Jetzt können Sie das Haskell-Buch für die reale Welt beenden, wenn Sie wollen. Das Überspringen von Kapiteln macht jetzt nichts mehr aus, solange Sie Monaden im Griff haben. Wählen Sie einfach aus, was Sie interessiert.
Mit dem Wissen, das Sie jetzt haben, sollten Sie in der Lage sein, die meisten der Pakete auf cabal zu benutzen (zumindest die dokumentierten...), sowie die meisten der Bibliotheken, die mit Haskell geliefert werden. Eine Liste interessanter Bibliotheken, die man ausprobieren sollte, wäre:
-
Parsec : zum Parsen von Programmen und Text. Viel besser als die Verwendung von Regexps. Ausgezeichnete Dokumentation, hat auch eine reale Welt Haskell Kapitel.
-
QuickCheck : Ein sehr cooles Testprogramm. Man schreibt ein Prädikat, das immer wahr sein sollte (z.B. length (reverse lst) == length lst
). Dann übergeben Sie das Prädikat an QuickCheck, das daraufhin eine Reihe von Zufallswerten (in diesem Fall Listen) erzeugt und prüft, ob das Prädikat für alle Ergebnisse zutrifft. Siehe auch die Online-Handbuch .
-
HUnit : Einheitstests in Haskell.
-
gtk2hs : Das beliebteste GUI-Framework für Haskell, mit dem man gtk-Anwendungen schreiben kann.
-
Glücksstapel : Ein Web-Entwicklungs-Framework für Haskell. Verwendet keine Datenbanken, sondern einen Datentypenspeicher. Ziemlich gute Dokumentationen (andere beliebte Frameworks wären schnappen und Jaod ).
Außerdem gibt es viele Konzepte (wie das Monaden-Konzept), die Sie irgendwann lernen sollten. Dies wird einfacher sein, als Monaden beim ersten Mal zu lernen, da Ihr Gehirn daran gewöhnt ist, mit der damit verbundenen Abstraktionsebene umzugehen. Ein sehr guter Überblick über diese hochrangigen Konzepte und wie sie zusammenpassen, ist die Typklassopädie .
-
Anwendbar: Eine Schnittstelle wie Monaden, aber weniger mächtig. Jede Monade ist Applicative, aber nicht umgekehrt. Dies ist nützlich, da es einige Typen gibt, die Applicative sind, aber keine Monaden sind. Außerdem ist Code, der mit Applicative-Funktionen geschrieben wird, oft besser zusammensetzbar als der entsprechende Code, der mit Monad-Funktionen geschrieben wird. Siehe Funktoren, applikative Funktoren und Monoide aus dem Handbuch "Lernen Sie Haskell".
-
Zusammenklappbar , Überquerbar : Typklassen, die viele der Operationen von Listen abstrahieren, so dass dieselben Funktionen auch auf andere Containertypen angewendet werden können. Siehe auch die haskell wiki erklärung .
-
Monoid : Ein Monoid ist ein Typ, der einen Null- (oder Mempty-) Wert und eine Operation hat, die mit <>
die zwei Monoide so miteinander verbindet, 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 z. B. 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 einfachste Pfeiltyp, aber es gibt viele andere Typen. Die Bibliothek hat auch viele sehr nützliche Funktionen für die Manipulation von Pfeilen - sie sind sehr nützlich, auch wenn sie nur mit einfachen alten Haskell-Funktionen verwendet werden.
-
Arrays : die verschiedenen veränderbaren/unveränderlichen Arrays in Haskell.
-
ST Monad : ermöglicht es Ihnen, Code mit einem veränderlichen Zustand zu schreiben, der sehr schnell ausgeführt werden kann und trotzdem außerhalb der Monade rein bleibt. Siehe den Link für weitere Details.
-
FRP: Functional Reactive Programming, eine neue, experimentelle Art, Code zu schreiben, der Ereignisse, Auslöser, Eingaben und Ausgaben (wie eine Benutzeroberfläche) verarbeitet. Ich weiß allerdings nicht viel darüber. Paul Hudaks Vortrag über Yampa ist ein guter Anfang.
Es gibt eine Menge neuer Sprachfunktionen, die Sie sich ansehen sollten. Ich werde sie nur aufzählen, Sie können viele Informationen über sie bei Google finden, die haskell wikibook die Website haskellwiki.org und ghc-Dokumentation .
- Multiparameter-Typenklassen/funktionale Abhängigkeiten
- Typ Familien
- Existenziell quantifizierte Typen
- Phantomtypen
- GADTS
- andere...
Ein Großteil von Haskell basiert auf Kategorientheorie Sie sollten sich also damit befassen. Eine gute Ausgangsbasis ist Kategorientheorie für Informatiker . Wenn Sie das Buch nicht kaufen möchten, können Sie sich auf der Website des Autors Artikel ist ebenfalls ausgezeichnet.
Schließlich werden Sie mehr über die verschiedenen Haskell-Werkzeuge erfahren wollen. Dazu gehören:
- ghc (und alle seine Funktionen)
- Kabale das Haskell-Paket-System
- darcs : ein verteiltes Versionskontrollsystem, das in Haskell geschrieben wurde und sehr beliebt für Haskell-Programme ist.
- Schellfisch Haskell: ein automatischer Dokumentationsgenerator
Während man all diese neuen Bibliotheken und Konzepte lernt, ist es sehr nützlich, ein mittelgroßes Projekt in Haskell zu schreiben. Das kann alles Mögliche sein (z. B. ein kleines Spiel, ein Datenanalysator, eine Website, Compiler ). Wenn Sie daran arbeiten, können Sie viele der Dinge, die Sie jetzt lernen, anwenden. Sie bleiben lange auf dieser Stufe (ich bin auf dieser Stufe).
Experte
Es wird Jahre dauern, bis Sie dieses Stadium erreicht haben (Hallo aus dem Jahr 2009!), aber von hier an werden Sie vermutlich Doktorarbeiten schreiben, neue Ghc-Erweiterungen entwickeln und neue Abstraktionen entwerfen.
Hilfe bekommen
Schließlich gibt es in jeder Phase des Lernens mehrere Möglichkeiten, sich zu informieren. Diese sind:
- der #haskell irc Kanal
- die Mailinglisten . Es lohnt sich, sich dort anzumelden, um die Diskussionen zu lesen, die dort stattfinden - einige sind sehr interessant.
- andere Orte, die auf der Homepage von haskell.org aufgeführt sind
Schlussfolgerung
Nun, das ist länger geworden, als ich erwartet hatte... Wie auch immer, ich denke, es ist eine sehr gute Idee, Haskell zu beherrschen. Es dauert lange, aber das liegt vor allem daran, dass man dabei eine völlig neue Denkweise lernt. Es ist nicht so, als würde man Ruby lernen, nachdem man Java gelernt hat, sondern so, als würde man Java lernen, nachdem man C gelernt hat. Außerdem habe ich festgestellt, dass sich meine Fähigkeiten in der objektorientierten Programmierung durch das Erlernen von Haskell verbessert haben, da ich viele neue Möglichkeiten zur Abstraktion von Ideen kennen gelernt habe.
14 Stimmen
tryhaskell.org