754 Stimmen

Erste Schritte mit Haskell

Ein paar Tage lang habe ich versucht, das funktionale Programmierparadigma in Haskell zu verstehen. Dazu habe ich Tutorials gelesen und Screencasts angeschaut, aber nichts scheint wirklich zu funktionieren. Beim Erlernen verschiedener imperativer/OO-Sprachen (wie C, Java, PHP) waren Übungen ein guter Weg für mich. Aber da ich nicht wirklich weiß, wozu Haskell fähig ist, und weil es viele neue Konzepte zu verwenden gibt, wusste ich nicht, wo ich anfangen sollte.

Wie haben Sie also Haskell gelernt? Was hat Sie dazu gebracht, das "Eis zu brechen"? Habt ihr auch gute Ideen für Übungen für den Anfang?

14 Stimmen

2572voto

David Miani Punkte 14378

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.

0 Stimmen

Ich danke Ihnen für die ausführliche Antwort. In meinem derzeitigen Stadium (absoluter Anfänger) freue ich mich besonders über die Haskell 99 Probleme. Ich habe auch diesen Thread gefunden stackoverflow.com/questions/779800/ was meiner Meinung nach wahrscheinlich für Programmierer vor oder in der Phase des "absoluten Anfängers" relevant ist.

39 Stimmen

Juhu, Pfeile! Zuerst lässt man Monaden sein Gehirn formen, dann steht man auf dem Kopf und denkt über Komonaden nach, und dann macht man beides gleichzeitig, um Pfeile zu erhalten :) Es gibt eine Menge Ausdrucksmöglichkeiten in Haskell, die auch mit der Programmierung auf Typebene erschlossen werden können.

1 Stimmen

@nanothief: Lernen über Monad antes de Functor y Applicative ist eine unnatürliche Abfolge... es ist besser, sie in der richtigen Reihenfolge zu lernen, wie sie in der typenklassopädie

186voto

jitter Punkte 52721

Ein Kollege von mir hat gute Erfahrungen gemacht mit Lernen Sie Haskell für einen guten Zweck! .

Das Tutorial richtet sich an Menschen, die Erfahrung mit imperativen Programmiersprachen Programmiersprachen haben, aber noch nicht in einer funktionalen Sprache programmiert haben.

Und prüfen Sie die Antworten hier zu

30 Stimmen

Ich unterstütze dies. Auch, da es nicht offensichtlich ist, hier ist ein Link zu einer herunterladbaren pdf-Version des Tutorials: learnyouahaskell.com/learnyouahaskell.pdf Das Webdesign ist großartig, aber ich möchte auch ein Exemplar für die U-Bahn haben.

8 Stimmen

Ich habe damit angefangen, bin aber der Meinung, dass man direkt zu Real World Haskell übergehen sollte. Der Unterschied ist, als würde man C von K&R oder "C für Dummies" lernen, das versucht, einfach zu sein, aber mit seinem Ansatz wichtige Dinge verpasst. Ich denke, es ist besser, sich einfach die Fakten zu vergegenwärtigen, anstatt zu versuchen, Haskell "auf die imperative Art" zu lernen.

7 Stimmen

Ich LIEBE dieses Buch und habe viel Zeit in dieses Buch und Real World Haskell investiert. IMO, "Learn You a Haskell" gibt einen tieferen Einblick als Real World Haskell, obwohl sie beide großartige Ressourcen sind.

104voto

David Johnstone Punkte 23632

Hier ist ein gutes Buch, das Sie online lesen können: Haskell in der realen Welt

Die meisten Haskell-Programme, die ich gemacht habe, waren zur Lösung von Projekt Euler Probleme.

Ein Ratschlag, den ich vor nicht allzu langer Zeit gelesen habe, lautete, dass man eine Reihe von einfachen Standardproblemen haben sollte, die man (theoretisch) lösen kann, und dann, wenn man versucht, eine neue Sprache zu lernen, diese Probleme in dieser Sprache implementiert.

3 Stimmen

Real World Haskell ist meiner Erfahrung nach großartig, bis man Kapitel 5 erreicht. Von da an würde ich es nicht mehr empfehlen.

0 Stimmen

Warum @MasterMastic? Was ist das Problem nach Kapitel 5? Das würde ich gerne wissen, bevor ich das Geld ausgebe.

1 Stimmen

@JayBlanchard In Kapitel 5 bekommt man ein konkretes Beispiel für eine Bibliothek, was nett ist, aber sie sagen einem, was sie tun werden, tun es, aber sie erklären nicht ganz, warum, und überhaupt nicht klar, und es gibt eine ganze Menge magischer Hex-Literale. Man geht nur die Bewegungen durch. Das war aber nicht das größte Problem für mich, das größte Problem war, dass das Buch stark von diesen harten und langen Beispielen abhängt (lang genug, um mehr als ein ganzes Kapitel zu füllen). Man kann kaum nur die Teile lesen, die man möchte. Ich denke, tolle Autoren, erstaunliches Wissen, aber extrem schlechte Ausführung.

73voto

eevar Punkte 3390

Ich habe diese 13-teilige Serie über funktionale Programmierung mit Haskell gerne gesehen.

C9 Vorlesungen: Dr. Erik Meijer - Grundlagen der funktionalen Programmierung: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/

71voto

yairchu Punkte 21749

Um die Antworten der anderen zu ergänzen - es gibt eine nützliche Funktion, die Ihnen beim Programmieren helfen wird (z. B. beim Lösen von Euler-Projekten): Hoogle . Sie können entweder die Befehlszeilenschnittstelle oder die Webschnittstelle .

Befehlszeile

Nachdem Sie die Haskell-Plattform installiert haben, stellen Sie sicher, dass Sie cabal install hoogle

Hoogle Verwendungsbeispiel:

Sie haben eine Funktion f x = 3 * x + 1 und Sie wollen es anwenden auf (5 :: Int) und wendet sie dann auf das Ergebnis und auf dieses Ergebnis usw. an und erhält eine unendliche Liste dieser Werte. Sie vermuten, dass es bereits eine Funktion gibt, die Ihnen helfen könnte (nicht speziell für Ihre f allerdings).

Diese Funktion wäre vom Typ (a -> a) -> a -> [a] wenn es dauert f 5 oder a -> (a -> a) -> [a] wenn es dauert 5 f (wir gehen davon aus, dass die Funktion für allgemeine Typen gilt und nicht nur für Int s)

$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]

ja, die Funktion, die Sie brauchen, gibt es bereits und sie heißt iterate . Sie verwenden es, indem Sie iterate func 5 !

Web-Schnittstelle

Das Ergebnis für dasselbe Beispiel lautet hier .

0 Stimmen

Die Suche nach den Standardbibliotheksfunktionen für das, was Sie brauchen, wird viel einfacher, wenn Sie wissen, wie Sie Hoogle um das bitten können, was Sie brauchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X