Seit einigen Tagen versuche ich, mich mit dem Paradigma der funktionalen Programmierung in Haskell zu beschäftigen. Ich habe dies getan, indem ich Tutorials gelesen und Screencasts angesehen habe, aber nichts scheint wirklich zu bleiben. 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 fähig ist und weil es viele neue Konzepte gibt, weiß 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?
haskell
functional-programming
Benutzer50685
quelle
quelle
Antworten:
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 dassx <> mempty = mempty <> x = x
undx <> (y <> z) = (x <> y) <> z
. Diese werden als Identitäts- und Assoziativitätsgesetze bezeichnet. Viele Typen sind Monoide wie Zahlen mitmempty = 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 .
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:
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:
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.
quelle
Monad
ist mächtiger, aber auch weniger kompositorisch ... viele Leute verwenden Monaden, bei denen sie mit sauberemApplicative
Code davonkommen könnten . Die meisten Dinge, dieFunctor
s sindMonad
, sind auch s, aber Sie gehen nicht herum>>=
undreturn
wannfmap
wird ausreichen, weil letzteres zu viel einfacherem Code führt, wenn Sie ihn verwenden können.Ein Kollege von mir hatte gute Erfahrungen mit Learn You a Haskell for Great Good! .
Und überprüfen Sie die Antworten hier zu
quelle
Hier ist ein gutes Buch, das Sie online lesen können: Real World Haskell
Die meisten Haskell-Programme, die ich durchgeführt habe, waren die Lösung 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, und dann, wenn Sie versuchen, eine neue Sprache zu lernen, diese Probleme in dieser Sprache implementieren.
quelle
Ich habe es genossen, diese 13-Episoden-Serie über funktionale Programmierung mit Haskell zu sehen.
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/
quelle
Um die Antworten anderer hinzuzufügen, gibt es eine nützliche Funktion, die Ihnen beim Codieren hilft (z. B. beim Lösen von Projekt-Euler-Problemen): Hoogle . Sie können entweder die Befehlszeilenschnittstelle oder die Weboberfläche 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 anwenden(5 :: Int)
, dann auf das Ergebnis und auf dieses Ergebnis usw. anwenden und eine unendliche Liste dieser Werte erhalten. Sie vermuten, dass möglicherweise bereits eine Funktion vorhanden ist, die Sie unterstützt (jedoch nicht speziell für Sief
).Diese Funktion wäre vom Typ,
(a -> a) -> a -> [a]
wenn sie benötigt wirdf 5
odera -> (a -> a) -> [a]
wenn sie benötigt wird5 f
(wir nehmen an, dass die Funktion für allgemeine Typen und nicht nur fürInt
s gilt).Ja, die Funktion, die Sie benötigen, ist bereits vorhanden und wird aufgerufen
iterate
. du benutzt es voniterate func 5
!Webschnittstelle
Das Ergebnis für dasselbe Beispiel finden Sie hier .
quelle
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, unabhängig davon, wohin Sie von dort aus gehen.
Insbesondere Kapitel 8 ("Functional Parsers") bietet die Grundlagen, die Sie für den Umgang mit Monaden benötigen, und ich denke, dies ist bei weitem der beste Ausgangspunkt, gefolgt von All About Monads . (Beachten Sie in Bezug auf dieses Kapitel jedoch die Errata auf der Website: Sie können das
do
Formular nicht ohne besondere Hilfe verwenden. Möglicherweise möchten Sie zuerst etwas über Typklassen lernen und dieses Problem selbst lösen.)Für Haskell-Anfänger wird dies selten betont, aber es lohnt sich, ziemlich früh zu lernen, nicht nur Monaden zu verwenden, sondern eigene zu konstruieren. Es ist nicht schwer, und maßgeschneiderte Aufgaben können eine Reihe von Aufgaben einfacher machen.
quelle
Versuchen Sie nicht, alle Monaden-Tutorials mit lustigen Metaphern zu lesen. Sie werden dich nur noch schlimmer durcheinander bringen.
quelle
Ich würde vorschlagen, dem #haskell irc-Kanal beizutreten und dort Fragen zu stellen. So habe ich Haskell gelernt. Wenn Sie wie oben vorgeschlagen durch Real World Haskell gehen, helfen Echtzeitantworten auf Ihre Fragen sehr. Viele kluge Leute auf #haskell schreiben Haskell zum Spaß und zum Profit, sodass Sie viele gute Beiträge erhalten. Versuch es!
quelle
Das sind meine Favoriten
Haskell: Funktionale Programmierung mit Typen
Real World Haskell
quelle
Als Einführung kann ich noch ein weiteres Haskell-Tutorial empfehlen .
Eine weitere gute Lernressource (wahrscheinlich auf mittlerer Ebene), die mir sehr geholfen hat und in den anderen Antworten meines Erachtens nicht erwähnt wurde, ist Brent Yorgeys Typeclassopedia , die in The Monad Reader (Ausgabe) zu finden ist 13)
Es ist in einem sehr zugänglichen Stil geschrieben und enthält (unter anderem) die folgenden einleitenden Ratschläge:
Der Monad Reader selbst ist eine absolute Fundgrube für funktionale Programmierer (nicht nur für Haskell-Programmierer).
quelle
Versuchen Sie, einfache Programme darin zu schreiben.
Beispielaufgaben finden Sie wahrscheinlich in verschiedenen Lehrbüchern.
Ich würde nicht empfehlen, sich an Haskell / FP-Lehrbücher zu halten. Versuchen Sie einfach, einfache Dinge damit zu tun: Berechnungen, Manipulationen von Zeichenfolgen, 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), da Haskell unendlich ist und es viele davon gibt.
quelle
Ich denke, dass die Realisierung von Haskells Feature anhand von Beispielen der beste Weg ist, um vor allem zu beginnen.
http://en.wikipedia.org/wiki/Haskell_98_features
Hier sind knifflige Typklassen wie Monaden und Pfeile
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 Zeit sparen: http://hackage.haskell.org/platform/
die Paketdatenbank für dieses System: http://hackage.haskell.org/
Wiki des GHC-Compilers: http://www.haskell.org/haskellwiki/GHC
Nach Haskell_98_features und Typeclassopedia können Sie die Dokumentation darüber wahrscheinlich bereits selbst finden und lesen
Übrigens möchten Sie vielleicht einige GHC-Spracherweiterungen testen, die möglicherweise in Zukunft Teil des Haskell-Standards sind.
Dies ist mein bester Weg, um Haskell zu lernen. Ich hoffe es kann dir helfen.
quelle
Ich schlage vor, dass Sie zuerst das Tutorial von BONUS lesen und dann Real World Haskell (kostenlos online) lesen . Treten Sie dem IRC-Kanal #Haskell auf irc.freenode.com bei bei und stellen Sie Fragen. Diese Leute sind absolut neulingfreundlich und haben mir im Laufe der Zeit sehr geholfen. Auch hier auf SO ist ein großartiger Ort, um Hilfe bei Dingen zu bekommen, die Sie nicht verstehen können! Versuchen Sie, sich nicht entmutigen zu lassen, sobald es klickt, wird Ihr Verstand überwältigt sein.
Das Tutorial von BONUS wird Sie vorbereiten und Sie auf die aufregende Fahrt vorbereiten, die Real World Haskell mit sich bringt. Ich wünsche Ihnen Glück!
quelle
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 #) anzugehen.
quelle
Die erste Antwort ist sehr gut. Um das Expertenlevel zu erreichen, 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 Verweise auf die aktuellsten Dinge in Haskell, die von der Haskell-Community genehmigt wurden.
quelle