it-swarm.com.de

Erste Schritte mit Haskell

Einige Tage lang habe ich versucht, mich mit dem Paradigma der funktionalen Programmierung in Haskell auseinanderzusetzen. Ich habe dazu Tutorials gelesen und Screencasts angesehen, aber nichts scheint wirklich zu stimmen. Beim Erlernen verschiedener Imperativ-/OO-Sprachen (wie C, Java, PHP) waren Übungen ein guter Weg für mich. Aber da ich nicht wirklich weiß, wozu Haskell in der Lage ist und weil es viele neue Konzepte gibt, die ich nutzen kann, wusste ich nicht, wo ich anfangen soll.

Wie haben Sie Haskell gelernt? Was hat dich wirklich dazu gebracht, "das Eis zu brechen"? Auch irgendwelche guten Ideen für den Beginn von Übungen?

756
anderstornvig

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, daher ist er ziemlich lang.

Absoluter Anfänger

Erstens ist Haskell zu allem fähig, mit genügend Geschick. Es ist sehr schnell (nach meiner Erfahrung nur 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 leichter zu schreiben sind als andere. Mathematische Probleme und Listenprozessprogramme sind hierfür gute Kandidaten, da sie nur die grundlegendsten Kenntnisse von Haskell erfordern, um schreiben zu können.

Erstens sind einige gute Leitfäden zum Erlernen der Grundlagen von Haskell das Happy Learn Haskell Tutorial und die ersten 6 Kapitel von Learn You A Haskell . Wenn 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 Haskell-Programmierung nach ersten Prinzipien und Programmierung in Haskell . Beide enthalten Übungen für jedes Kapitel, sodass Sie kleine, einfache Probleme haben, die mit dem übereinstimmen, was Sie auf den letzten Seiten gelernt haben.

Eine gute Liste der zu versuchenden Probleme ist die Seite haskell 99 problems . Diese beginnen sehr einfach und werden im weiteren Verlauf schwieriger. Es ist eine sehr gute Übung, viele dieser Aufgaben zu erledigen, da Sie damit Ihre Fähigkeiten in Rekursions- 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. Aktivieren Sie diese SO Frage , wenn Sie Ihre Lösungen mit QuickCheck testen möchten (siehe Intermediate unten).

Wenn Sie einige davon erledigt haben, können Sie mit einigen der Project Euler Probleme fortfahren. Diese sind nach der Anzahl der Personen sortiert, was ein ziemlich guter Hinweis auf Schwierigkeiten ist. Diese testen Ihre Logik und Haskell mehr als die vorherigen Probleme, aber Sie sollten trotzdem in der Lage sein, die ersten paar zu lösen. Ein großer Vorteil, den Haskell bei diesen Problemen hat, ist, dass die Größe von Ganzzahlen nicht begrenzt ist. Um einige dieser Probleme zu lösen, sollten Sie auch die Kapitel 7 und 8 lesen, in denen Sie einen Haskell lernen.

Anfänger

Danach sollten Sie sich mit Rekursions- und Funktionen höherer Ordnung auskennen. Es ist also ein guter Zeitpunkt, um einige Probleme der realen Welt zu lösen. Ein sehr guter Anfang ist Real World Haskell (Online-Buch, Sie können auch eine Hardcopy kaufen). Ich fand die ersten Kapitel zu schnell eingeführt für jemanden, der noch nie eine funktionale Programmierung/Rekursion durchgeführt hat. Jedoch mit der Übung, die Sie von den vorherigen Problemen gehabt hätten, sollten Sie es vollkommen verständlich finden.

Das Durcharbeiten der in diesem Buch beschriebenen Probleme ist eine hervorragende Möglichkeit, um zu lernen, wie Abstraktionen verwaltet und wiederverwendbare Komponenten in Haskell erstellt werden. Dies ist von entscheidender Bedeutung für Benutzer, die an objektorientiertes (oo) Programmieren gewöhnt sind, da die normalen oo Abstraktionsmethoden (oo Klassen) in Haskell nicht vorkommen (Haskell hat Typklassen, aber sie unterscheiden sich sehr von oo Klassen, eher wie oo Schnittstellen) ). Ich halte es nicht für eine gute Idee, Kapitel zu überspringen, da in jedem Kapitel viele neue Ideen vorgestellt werden, die in späteren Kapiteln verwendet werden.

Nach einer Weile kommen 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 abstrakt ist. Mir fällt kein Konzept in einer anderen Sprache ein, das so abstrakt ist wie Monaden in der funktionalen Programmierung. Monaden ermöglichen es, viele Ideen (wie IO Operationen, Berechnungen, die fehlschlagen könnten, Parsen, ...) unter einer Idee zu vereinen. Lassen Sie sich also nicht entmutigen, wenn Sie nach dem Lesen des Kapitels über Monaden diese 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 der Monaden-Tutorials . Ich empfehle die All About Monads , aber die anderen sind auch gut.

Außerdem dauert es eine Weile, bis sich die Konzepte wirklich durchsetzen. Dies geschieht durch die Nutzung, aber auch durch die Zeit. Ich finde, manchmal hilft Schlafen bei einem Problem mehr als alles andere! Irgendwann wird die Idee klicken und Sie werden sich fragen, warum Sie Probleme damit hatten, ein Konzept zu verstehen, das in Wirklichkeit unglaublich einfach ist. Es ist fantastisch, wenn dies passiert, und wenn dies der Fall ist, könnte Haskell Ihre bevorzugte imperative Programmiersprache sein :)

Um sicherzustellen, dass Sie das Haskell-Typ-System perfekt verstehen, sollten Sie versuchen, 20 zwischenzeitliche Haskell-Übungen zu lösen. Diese Übungen verwenden lustige Namen von Funktionen wie "pelzig" und "Banane" und helfen Ihnen dabei, einige grundlegende Konzepte der funktionalen Programmierung zu verstehen, wenn Sie sie noch nicht haben. Eine schöne Art, den Abend mit einem Bündel Papieren zu verbringen, die mit Pfeilen, Einhörnern, Würstchen und pelzigen Bananen bedeckt sind.

Mittelstufe

Wenn Sie Monaden erst einmal verstanden haben, haben Sie vermutlich den Übergang von einem Haskell-Programmierer für Anfänger zu einem fortgeschrittenen Haskeller vollzogen. Also, wohin soll es von hier aus gehen? Das erste, was ich empfehlen würde (wenn Sie sie noch nicht aus Monaden gelernt haben), sind die verschiedenen Monadentypen wie Reader, Writer und State. Auch hier berichten Real world Haskell und All about monads sehr 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. Das 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 Haskell-Buch der realen Welt fertigstellen, wenn Sie möchten. Das Überspringen von Kapiteln spielt keine Rolle, solange Sie Monaden haben. Wählen Sie einfach, woran Sie interessiert sind.

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 wäre:

  • Parsec : zum Parsen von Programmen und Text. Viel besser als reguläre Ausdrücke. Ausgezeichnete Dokumentation, hat auch ein echtes Haskell-Kapitel.

  • QuickCheck : Ein sehr cooles Testprogramm. Sie schreiben ein Prädikat, das immer wahr sein soll (zB length (reverse lst) == length lst). Sie übergeben dann das Prädikat QuickCheck, und es werden viele zufällige Werte (in diesem Fall Listen) generiert, und es wird geprüft, ob das Prädikat für alle Ergebnisse wahr ist. Siehe auch 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 Webentwicklungsframework 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 es gewohnt ist, mit dem Grad der Abstraktion umzugehen. Eine sehr gute Übersicht, um mehr über diese übergeordneten Konzepte zu erfahren und wie sie zusammenpassen, ist die Typeclassopedia .

  • Anwendbar: Eine Schnittstelle wie Monaden, aber weniger leistungsfähig. Jede Monade ist zutreffend, aber nicht umgekehrt. Dies ist nützlich, da es einige Typen gibt, die zutreffend sind, jedoch keine Monaden. Außerdem ist Code, der mit den Funktionen von Applicative geschrieben wurde, häufig komponierbarer als der entsprechende Code mit den Funktionen von Monad. Siehe Functors, Applicative Functors und Monoids vom learn you a haskell guide.

  • faltbar , überfahrbar : Typenklassen, die viele Operationen von Listen abstrahieren, sodass die gleichen Funktionen auf andere Containertypen angewendet werden können. Siehe auch Erklärung zum Haskell-Wiki .

  • Monoid : Ein Monoid ist ein Typ mit einem Nullwert (oder einem leeren Wert) und einer mit <> bezeichneten 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, z. B. Zahlen, mit mempty = 0 und <> = +. Dies ist in vielen Situationen nützlich.

  • Pfeile : Pfeile stellen Berechnungen dar, die eine Eingabe annehmen und eine Ausgabe zurückgeben. Eine Funktion ist die grundlegendste Pfeilart, aber es gibt viele andere Arten. Die Bibliothek hat auch viele sehr nützliche Funktionen zum Bearbeiten von Pfeilen - sie sind sehr nützlich, auch 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 auch 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, Trigger, Ein- und Ausgaben (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 ghc documentation finden.

  • Multiparameter-Typklassen/funktionale Abhängigkeiten
  • Geben Sie Familien ein
  • Existenziell quantifizierte Typen
  • Phantomtypen
  • GADTS
  • andere...

Eine Menge von Haskell basiert auf Kategorietheorie . Vielleicht möchten Sie sich das genauer ansehen. Ein guter Ausgangspunkt ist Kategorietheorie für Informatiker . Wenn Sie das Buch nicht kaufen möchten, ist auch das vom Autor bezogene article ausgezeichnet.

Schließlich möchten Sie mehr über die verschiedenen Haskell-Tools erfahren. Diese schließen ein:

  • ghc (und all seine Funktionen)
  • cabal : 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 kennenlernen, ist es sehr nützlich, ein mittelgroßes Projekt in Haskell zu schreiben. Dies kann alles sein (z. B. ein kleines Spiel, ein Datenanalysator, eine Website, Compiler ). Wenn Sie daran arbeiten, können Sie viele der Dinge anwenden, die Sie gerade lernen. Du bleibst ewig auf diesem Level (hier bin ich).

Experte

Es wird Jahre dauern, bis Sie diesen Punkt erreicht haben (hallo ab 2009!), Aber ab hier schreiben Sie vermutlich Doktorarbeiten, neue Ghc-Erweiterungen und lassen sich neue Abstraktionen einfallen.

Hilfe anfordern

Schließlich gibt es zu jedem Zeitpunkt des Lernens 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, die auf der Homepage von haskell.org aufgeführt sind

Fazit

Nun, das hat sich länger als erwartet herausgestellt ... Jedenfalls halte ich es für eine sehr gute Idee, Haskell zu beherrschen. Es dauert lange, aber das liegt hauptsächlich daran, dass Sie auf diese Weise eine völlig neue Denkweise erlernen. Es ist nicht wie das Lernen vonRubynach dem Erlernen von Java, sondern wie das Lernen vonJavanach dem Erlernen von C. Außerdem stelle ich fest, dass sich meine objektorientierten Programmierfähigkeiten durch das Erlernen von Haskell verbessert haben Ich sehe viele neue Wege, um Ideen zu abstrahieren.

2423
David Miani

Ein Kollege von mir hatte gute Erfahrungen mit Learn You a Haskell for Great Good! .

Tutorial für Leute, die Erfahrung mit imperativen Programmiersprachen haben, aber noch nie in einer funktionalen Sprache programmiert haben.

Und überprüfen Sie die Antworten hier auch

176
jitter

Hier ist ein gutes Buch, das Sie online lesen können: Real World Haskell

Die meisten Haskell-Programme, die ich durchgeführt habe, waren das Lösen von Project Euler Problemen.

Ein Ratschlag, den ich vor nicht allzu langer Zeit gelesen habe, war, dass Sie einen Standardsatz einfacher Probleme haben sollten, die Sie (theoretisch) lösen können. Wenn Sie dann versuchen, eine neue Sprache zu lernen, implementieren Sie diese Probleme in dieser Sprache.

102
David Johnstone

Ich habe es genossen, mir diese 13-Folgen-Serie über Functional Programming mit Haskell anzuschauen.

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/

72
eevar

Um die Antworten anderer zu ergänzen, gibt es eine nützliche Funktion, die Ihnen beim Codieren hilft (zum Beispiel beim Lösen von Euler-Problemen): Hoogle . Sie können entweder die Befehlszeilenschnittstelle oder die Webschnittstelle verwenden.

Befehlszeile

Stellen Sie nach der Installation der Haskell-Plattform sicher, dass cabal install hoogle

Hoogle-Verwendungsbeispiel:

Sie haben eine Funktion f x = 3 * x + 1 und möchten sie auf (5 :: Int) anwenden. Wenden Sie sie dann auf das Ergebnis und auf dieses Ergebnis usw. an und erhalten eine unendliche Liste dieser Werte. Sie vermuten, dass bereits eine Funktion vorhanden ist, die Sie unterstützt (allerdings nicht speziell für Ihr f).

Diese Funktion würde vom Typ (a -> a) -> a -> [a] sein, wenn sie f 5 oder a -> (a -> a) -> [a] braucht, wenn sie 5 f braucht (wir nehmen an, dass die Funktion für allgemeine Typen und nicht nur für Ints ist )

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

ja, die von Ihnen benötigte Funktion ist bereits vorhanden und heißt iterate. du benutzt es von iterate func 5!

Weboberfläche

Das Ergebnis für dasselbe Beispiel ist hier .

69
yairchu

Graham Huttons Programmierung in Haskell ist prägnant, ziemlich gründlich, und seine jahrelange Lehrtätigkeit in Haskell zeigt es wirklich. Es ist fast immer das, womit ich den Leuten empfehle, egal wo Sie von dort aus hingehen.

Insbesondere bietet Kapitel 8 ("Funktionale Parser") die eigentliche Grundlage, um mit Monaden zu beginnen, und ich denke, dies ist bei weitem der beste Ausgangspunkt, gefolgt von Alles über Monaden . (Beachten Sie jedoch in Bezug auf dieses Kapitel die Errata von der Website: Sie können das Formular do nicht ohne spezielle Hilfe verwenden. Sie möchten möglicherweise zuerst etwas über Typenklassen lernen und das Problem in diesem Fall lösen.) dein eigenes.)

Dies wird für Haskell-Anfänger selten betont, aber es lohnt sich, relativ früh zu lernen, nicht nur Monaden zu verwenden, sondern auch eigene zu konstruieren. Es ist nicht schwer, und angepasste Aufgaben können eine Reihe von Aufgaben einfacher machen.

57
Curt J. Sampson

Versuchen Sie nicht, alle Monaden-Tutorials mit lustigen Metaphern zu lesen. Sie werden Sie nur noch schlimmer durcheinander bringen.

51
John Smith

Ich würde vorschlagen, dem # haskell irc channel beizutreten und dort Fragen zu stellen. So habe ich Haskell gelernt. Wenn Sie sich wie oben beschrieben mit Real World Haskell befassen, können Sie Ihre Fragen in Echtzeit beantworten. Viele clevere Leute auf #haskell schreiben Haskell zum Spaß und zum Profit, so dass Sie viele gute Inputs bekommen. Versuch es!

31
shapr

Das sind meine Favoriten

Haskell: Funktionale Programmierung mit Typen

Joeri van Eekelen, et al. | Wikibooks
       Published in 2012, 597 pages

Real World Haskell

   B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
   Published in 2008, 710 pages
24
Soner Gönül

Ich kann zusätzlich empfehlen Noch ein Haskell Tutorial als Einführung.

Eine andere gute Lernressource (wahrscheinlich auf mittlerer Ebene), die mir sehr geholfen hat und in den anderen Antworten nicht erwähnt wurde, ist, soweit ich sehen kann, Brent Yorgeys Typeclassopedia , zu finden in The Monad Reader (Ausgabe 13)

Es ist in einem sehr leicht zugänglichen Stil geschrieben und enthält (unter anderem) die folgenden einleitenden Ratschläge:

Es gibt zwei Schlüssel für die Weisheit eines erfahrenen Haskell-Hackers:

  1. Verstehe die Typen.

  2. Machen Sie sich mit jeder Typklasse und ihrer Beziehung zu anderen Typklassen vertraut, und machen Sie sich mit vielen Beispielen vertraut.

Der Monad Reader selbst ist eine absolute Fundgrube für funktionierende Programmierer (nicht nur Haskell-Programmierer).

19
Greg S

Ich denke, dass die Realisierung von Haskells Merkmalen anhand von Beispielen der beste Weg ist, um vor allem anzufangen.

http://en.wikipedia.org/wiki/Haskell_98_features

Hier gibt es knifflige Schriftklassen mit Monaden und Pfeilen

http://www.haskell.org/haskellwiki/Typeclassopedia

denken Sie bei Problemen in der realen Welt und größeren Projekten an die folgenden Tags: GHC (am häufigsten verwendeter Compiler), Hackage (libraryDB), Cabal (Gebäudesystem), darcs (ein anderes Gebäudesystem).

Ein integriertes System kann Ihre Zeit sparen: http://hackage.haskell.org/platform/

die Paketdatenbank für dieses System: http://hackage.haskell.org/

GHC-Compiler-Wiki: http://www.haskell.org/haskellwiki/GHC

Nach Haskell_98_features und Typeclassopedia können Sie die Dokumentation wahrscheinlich bereits selbst finden und lesen

Übrigens möchten Sie möglicherweise die Spracherweiterung von GHC testen, die in Zukunft möglicherweise Teil des haskell-Standards sein wird.

das ist mein bester Weg, um Haskell zu lernen. ich hoffe es kann dir helfen.

14
snow

Versuchen Sie, einfache Programme darin zu schreiben.

Beispielaufgaben finden Sie wahrscheinlich in verschiedenen Lehrbüchern.

Ich würde nicht empfehlen, an Haskell/FP-Lehrbüchern festzuhalten. Versuchen Sie einfach, einfache Dinge damit zu tun: Berechnungen, Zeichenfolgenmanipulationen, Dateizugriff.

Nachdem ich ein Dutzend gelöst habe, habe ich das Eis gebrochen :)

Lesen Sie danach viel über fortgeschrittene Konzepte (Monaden, Pfeile, E/A, rekursive Datenstrukturen), denn haskell ist unendlich und es gibt viele davon.

14
alamar

Ich schlage vor, dass Sie zuerst BONUS 'Tutorial und dann Real World Haskell (kostenlos online) lesen. Treten Sie dem Kanal # Haskell IRC auf irc.freenode.com bei und stellen Sie Fragen. Diese Leute sind absolut neulingfreundlich und haben mir im Laufe der Zeit sehr geholfen. Genau hier auf SO können Sie sich mit Dingen helfen lassen, die Sie nicht fassen können! Versuchen Sie, sich nicht entmutigen zu lassen, sobald es klickt, wird Ihr Verstand zerstört.

Das BONUS-Tutorial wird Sie aufrüsten und Sie auf die aufregende Fahrt vorbereiten, die Real World Haskell mit sich bringt. Ich wünsche Ihnen Glück!

13
Rayne

Wenn Sie nur Erfahrung mit imperativen/OO-Sprachen haben, empfehle ich die Verwendung einer konventionelleren funktionalen Sprache als Sprungbrett. Haskell ist wirklich anders und man muss viele verschiedene Konzepte verstehen, um irgendwohin zu gelangen. Ich schlage vor, zuerst eine Sprache im ML-Stil (wie z. B. F #) zu behandeln.

12
JacquesB

Die erste Antwort ist sehr gut. Um zum Expertenlevel zu gelangen, sollten Sie mit einigen Experten selbst promovieren.

Ich empfehle Ihnen, die Haskell-Seite zu besuchen: http://haskell.org . Dort gibt es viel Material und viele Hinweise auf die aktuellsten Inhalte in Haskell, die von der Haskell-Community genehmigt wurden.

10
user354231