Frage Erste Schritte mit Haskell


Seit einigen Tagen versuche ich, mich mit dem funktionalen Programmierparadigma von Haskell zu beschäftigen. Ich habe das getan, indem ich Tutorials gelesen und Screencasts gesehen habe, aber nichts scheint wirklich zu haften. Beim Erlernen verschiedener imperativer / OO-Sprachen (wie C, Java, PHP) waren Übungen eine gute Möglichkeit für mich, zu gehen. Aber da ich nicht wirklich weiß, wozu Haskell fähig ist und weil es viele neue Konzepte zu verwenden gibt, weiß ich nicht, wo ich anfangen soll.

Also, wie hast du Haskell gelernt? Was hat dich wirklich dazu gebracht, "das Eis zu brechen"? Auch irgendwelche guten Ideen für beginnende Übungen?


758


Ursprung


Antworten:


Ich werde diesen Guide nach dem Können, das Sie in haskell haben, bestellen, vom Anfänger bis zum Experten. Beachten Sie, dass dieser Prozess viele Monate (Jahre) dauern wird, also ist es 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, GUI und Web-Anwendungen.

Es gibt jedoch einige Probleme, die für einen Anfänger in Haskell einfacher zu schreiben sind als andere. Mathematische Probleme und Listenprozeduren sind gute Kandidaten dafür, da sie nur das grundlegendste Haskell-Wissen benötigen, um schreiben zu können.

Erstens, einige gute Anleitungen zum Erlernen der Grundlagen von Haskell sind die glücklich lernen Haskell-Tutorial und die ersten 6 Kapitel von lerne ein Haskell. Während Sie diese lesen, ist es eine sehr gute Idee, auch einfache Probleme mit dem, was Sie wissen, zu lösen.

Weitere zwei gute Ressourcen sind Haskell Programmierung von den ersten Prinzipien, und Programmierung in Haskell. Sie kommen beide mit Übungen für jedes Kapitel, also haben Sie kleine einfache Probleme, die mit dem übereinstimmen, was Sie auf den letzten Seiten gelernt haben.

Eine gute Liste von Problemen zu versuchen ist die Haskell 99 Probleme Seite. Diese beginnen sehr einfach und werden schwieriger, wenn du weitermachst. Es ist eine sehr gute Übung, viele davon zu machen, da sie Ihnen erlauben, Ihre Fähigkeiten in Rekursion und Funktionen höherer Ordnung zu üben. Ich würde empfehlen, alle Probleme zu überspringen, die Zufälligkeit erfordern, da das in Haskell etwas schwieriger ist. Prüfen diese SO Frage falls Sie Ihre Lösungen mit QuickCheck testen möchten (siehe Mittlere unten).

Sobald Sie ein paar davon getan haben, könnten Sie mit einigen der Projekt Euler Probleme. Diese werden nach der Anzahl der Personen sortiert, was ein guter Indikator für die Schwierigkeit ist. Diese testen Ihre Logik und hakskell mehr als die vorherigen Probleme, aber Sie sollten immer noch in der Lage sein, die ersten paar zu tun. Ein großer Vorteil, den Haskell mit diesen Problemen hat, ist Integers sind nicht in der Größe begrenzt. Um einige dieser Probleme zu lösen, wird es nützlich sein, die Kapitel 7 und 8 gelesen zu haben, um auch ein Haskell zu lernen.

Anfänger

Danach sollte man Rekursion und Funktionen höherer Ordnung ziemlich gut handhaben können, also wäre es ein guter Zeitpunkt, um einige reale Probleme zu lösen. Ein sehr guter Startpunkt ist Wirkliche Welt Haskell (Online-Buch, Sie können auch eine Hardcopy kaufen). Ich fand die ersten paar Kapitel zu schnell für jemanden, der noch nie funktionale Programmierung / Rekursion durchgeführt hat. Aber mit der Praxis, die Sie von den vorherigen Problemen gehabt hätten, sollten Sie es vollkommen verständlich finden.

Das Durcharbeiten der Probleme im Buch ist eine großartige Möglichkeit zu lernen, wie man Abstraktionen verwaltet und wiederverwendbare Komponenten in haskell erstellt. Dies ist lebenswichtig für Leute, die an objektorientierte (oo) Programmierung gewöhnt sind, da die normalen oo Abstraktionsmethoden (oo Klassen) nicht in haskell erscheinen (haskell hat Typenklassen, aber sie unterscheiden sich sehr von oo Klassen, eher wie oo Interfaces ). Ich denke nicht, dass es eine gute Idee ist, Kapitel zu überspringen, da jedes eine Menge neuer Ideen einführt, die in späteren Kapiteln verwendet werden.

Nach einer Weile wirst du zu Kapitel 14, dem gefürchteten Monadenkapitel (dum dum dummmm), gelangen. Fast jeder, der Haskell lernt, hat Schwierigkeiten, Monaden zu verstehen, aufgrund dessen, wie abstrakt das Konzept ist. Ich kann mir kein Konzept in einer anderen Sprache vorstellen, das so abstrakt ist wie Monaden in der funktionalen Programmierung. Monads erlaubt es, viele Ideen (wie IO-Operationen, Berechnungen, die fehlschlagen könnten, Parsing, ...) unter einer Idee zu vereinen. Sei also nicht entmutigt, wenn du sie nach dem Lesen des Monadenkapitels nicht wirklich verstehst. Ich fand es nützlich, viele verschiedene Erklärungen von Monaden zu lesen; jeder gibt eine neue Perspektive auf das Problem. Hier ist ein sehr gutes Liste der Monad Tutorials. Ich empfehle das Alles über Monaden, aber die anderen sind auch gut.

Es dauert auch eine Weile, bis die Konzepte wirklich einsinken. Dies kommt durch den Gebrauch, aber auch durch die Zeit. Ich finde, dass manchmal das Schlafen bei einem Problem mehr hilft als alles andere! Irgendwann klickt die Idee, und Sie werden sich fragen, warum Sie sich bemüht haben, ein Konzept zu verstehen, das in Wirklichkeit unglaublich einfach ist. Es ist großartig, wenn das passiert, und wenn es passiert, könnten Sie Haskell als Ihre bevorzugte imperative Programmiersprache finden :)

Um sicherzustellen, dass Sie das Haskell-System perfekt verstehen, sollten Sie versuchen, es zu lösen 20 Zwischen-Haskell-Übungen. Diese Übungen verwenden lustige Namen von Funktionen wie "furry" und "banana" und helfen Ihnen, einige grundlegende funktionale Programmierkonzepte zu verstehen, wenn Sie sie noch nicht haben. Schöne Art, den Abend mit einer Liste von Papier zu verbringen, die mit Pfeilen, Einhörnern, Würstchen und pelzigen Bananen bedeckt ist.

Mittlere

Sobald du Monads verstehst, denke ich, dass du den Übergang von einem Anfänger-Haskell-Programmierer zu einem Zwischen-Haskeller geschafft hast. Wohin also von hier? Das erste, was ich empfehlen würde (wenn Sie sie nicht bereits vom Lernen von Monaden gelernt haben), sind die verschiedenen Arten von Monaden, wie zum Beispiel Reader, Writer und State. Noch einmal, Real world haskell und All about monades gibt eine große Berichterstattung darüber. Um Ihr Monad-Training abzuschließen, ist das Lernen über Monad-Transformatoren ein Muss. Mit diesen können Sie verschiedene Arten von Monaden (wie zum Beispiel eine Reader- und State-Monade) zu einem kombinieren. Dies mag von Anfang an nutzlos erscheinen, aber nachdem Sie sie einige Zeit benutzt haben, werden Sie sich fragen, wie Sie ohne sie gelebt haben.

Jetzt können Sie das reale Welthaskellbuch beenden, wenn Sie wollen. Das Überspringen von Kapiteln ist jetzt aber nicht wirklich wichtig, solange du einen Monaden runter hast. Wählen Sie einfach, was Sie interessiert.

Mit dem Wissen, das Sie jetzt haben, sollten Sie in der Lage sein, die meisten Pakete auf cabal zu verwenden (zumindest die dokumentierten ...), sowie die meisten Bibliotheken, die mit haskell geliefert werden. Eine Liste von interessanten Bibliotheken zum ausprobieren wäre:

  • Parsec: zum Parsen von Programmen und Text. Viel besser als die Verwendung von Regexps. Ausgezeichnete Dokumentation, hat auch ein echtes Haskell-Kapitel.

  • Schneller Check: Ein sehr cooles Testprogramm. Sie schreiben ein Prädikat, das immer wahr sein soll (z. B. length (reverse lst) == length lst). Sie übergeben dann das Prädikat the quickCheck und es wird viele zufällige Werte (in diesem Fall Listen) generieren und testen, dass das Prädikat für alle Ergebnisse wahr ist. Siehe auch die Online-Handbuch.

  • HUnit: Unit-Tests in Haskell.

  • gtk2hs: Das beliebteste GUI-Framework für Haskell, können Sie GTK-Anwendungen in Haskell schreiben.

  • happstack: Ein Web-Entwicklungs-Framework für Haskell. Verwendet keine Datenbanken, sondern einen Datentypspeicher. Ziemlich gute Docs (andere beliebte Frameworks wären schnappen und Jawohl).

Außerdem gibt es viele Konzepte (wie das Monad-Konzept), die Sie schließlich lernen sollten. Dies wird einfacher sein, als Monaden das erste Mal zu lernen, da Ihr Gehirn daran gewöhnt ist, mit dem Abstraktionsgrad umzugehen. Ein sehr guter Überblick über diese hochrangigen Konzepte und wie sie zusammenpassen, ist die Artclassopedia.

  • Applicative: Eine Schnittstelle wie Monaden, aber weniger leistungsfähig. Jede Monade ist Applicative, aber nicht umgekehrt. Dies ist nützlich, da es einige Typen gibt, die zwar Applicative, aber keine Monads sind. Außerdem ist Code, der unter Verwendung der anwendungsbezogenen Funktionen geschrieben wird, oft kompostierbarer als das Schreiben des äquivalenten Codes unter Verwendung der Monad-Funktionen. Sehen Funktoren, anwendende Funktoren und Monoide Von dem lernen Sie einen Haskell Guide.

  • Faltbar,Durchsuchbar: Typeclasses, die viele der Operationen von Listen abstrahieren, sodass 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 Wert null (oder mempty) und eine notierte Operation hat <> das verbindet zwei Monoids zusammen, so dass x <> mempty = mempty <> x = x und x <> (y <> z) = (x <> y) <> z. Diese werden als Identitäts- und Assoziativgesetze bezeichnet. Viele Arten 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 und eine Ausgabe zurückgeben. Eine Funktion ist die grundlegendste Art von Pfeil, aber es gibt viele andere Arten. Die Bibliothek hat auch viele sehr nützliche Funktionen zum Manipulieren von Pfeilen - sie sind sehr nützlich, selbst wenn sie nur mit einfachen alten Haskell-Funktionen verwendet werden.

  • Arrays: Die verschiedenen veränderbaren / unveränderlichen Arrays in Haskell.

  • ST Monad: lässt Sie Code mit einem veränderbaren Zustand schreiben, der sehr schnell läuft, während er außerhalb der Monade immer noch rein bleibt. Siehe den Link für weitere Details.

  • FRP: Functional Reactive Programming, eine neue, experimentelle Art, Code zu schreiben, der Ereignisse, Trigger, Eingaben und Ausgaben behandelt (wie zum Beispiel eine GUI). Ich weiß aber nicht viel darüber. Paul Hudak spricht ü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 finden, die haskell Wikibook, die Website haskellwiki.org und ghc-Dokumentation.

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

Eine Menge Haskell basiert darauf KategorientheorieVielleicht möchten Sie sich das genauer ansehen. Ein guter Ausgangspunkt ist Kategorietheorie für Informatiker. Wenn Sie das Buch nicht kaufen wollen, ist der Autor verwandt Artikel ist auch ausgezeichnet.

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

  • ghc (und all seine Eigenschaften)
  • Kabale: Das Haskell-Paketsystem
  • Darts: ein verteiltes Versionskontrollsystem, geschrieben in haskell, sehr beliebt für Haskell-Programme.
  • Schellfisch: ein haskell automatischer Dokumentationsgenerator

Wenn man all diese neuen Bibliotheken und Konzepte lernt, ist es sehr nützlich, ein mittelgroßes Projekt in Haskell zu schreiben. Es kann alles sein (zB ein kleines Spiel, Datenanalysator, 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 du zu dieser Phase kommst (hallo aus dem Jahr 2009!), Aber von hier denke ich, dass du mit dem Schreiben von PhD-Papieren, neuen ghc-Erweiterungen und neuen Abstraktionen beginnst.

Hilfe bekommen

Schließlich gibt es in jeder Phase des Lernens mehrere Orte, um Informationen zu erhalten. Diese sind:

  • der #haskell irc Kanal
  • das Mailinglisten. Diese sind es wert, sich anzumelden, um nur die Diskussionen zu lesen - einige sind sehr interessant.
  • andere Orte, die auf der haskell.org-Homepage aufgelistet sind

Fazit

Nun, das war länger als ich erwartet hatte ... Wie auch immer, ich denke, es ist eine sehr gute Idee, Haskell zu beherrschen. Es braucht eine lange Zeit, aber das liegt vor allem daran, dass Sie damit eine völlig neue Denkweise lernen. Es ist nicht so, wie Ruby nach dem Lernen von Java zu lernen, sondern wie Java nach dem Lernen zu lernen. Außerdem stelle ich fest, dass meine objektorientierten Programmierfähigkeiten sich durch das Lernen von Haskell verbessert haben, da ich viele neue Wege sehe, Ideen zu abstrahieren.


2318



Ein Kollege von mir hatte gute Erfahrungen damit Lernen Sie ein Haskell für Großartiges!.

Tutorial richtet sich an Menschen, die haben   Erfahrung in der imperativen Programmierung   Sprachen aber nicht in a programmiert   funktionale Sprache vorher.

Und überprüfe die Antworten Hier auch


170



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

Die meisten Haskell-Programme, die ich gemacht habe, mussten gelöst werden Projekt Euler Probleme.

Ein Ratschlag, den ich vor nicht allzu langer Zeit gelesen habe, war, dass du ein Standard-Set einfacher Probleme haben solltest, die du lösen kannst (theoretisch) und dann, wenn du versuchst, eine neue Sprache zu lernen, implementierst du diese Probleme in dieser Sprache.


98



Ich habe es genossen, diese 13 Folge-Serie über Funktionales Programmieren mit Haskell zu sehen.

C9 Vorträge: Dr. Erik Meijer - Funktionale Grundlagen der Programmierung: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamental-Chapter-1/


70



Um die Antworten anderer hinzuzufügen, gibt es einen nützlichen, der Ihnen beim Codieren hilft (zum Beispiel beim Lösen von Euler-Problemen): Hoogle. Sie können entweder die Befehlszeilenschnittstelle oder die Webschnittstelle.

Befehlszeile

Nachdem Sie die Haskell-Plattform installiert haben, achten Sie darauf cabal install hoogle

Hoogle Verwendungsbeispiel:

Du hast eine Funktion f x = 3 * x + 1 und Sie möchten es anwenden (5 :: Int), dann wende es auf das Ergebnis und auf dieses Ergebnis an und erhalte eine unendliche Liste dieser Werte. Sie vermuten, dass möglicherweise bereits eine Funktion vorhanden ist, die Sie unterstützt (nicht speziell für Sie f obwohl).

Diese Funktion wäre von Typ (a -> a) -> a -> [a] wenn es dauert f 5 oder a -> (a -> a) -> [a] wenn es dauert 5 f (Wir nehmen an, die Funktion ist für allgemeine Typen und nicht nur für Ints)

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

Ja, die Funktion, die Sie brauchen, existiert bereits und es heißt iterate. Du benutzt es von iterate func 5!

Webschnittstelle

Das Ergebnis für das gleiche Beispiel kann gefunden werden Hier.


64



Graham Hutton Programmierung in Haskell ist prägnant, einigermaßen gründlich, und seine jahrelange Unterrichtstätigkeit hat Haskell wirklich gezeigt. Es ist fast immer, was ich den Leuten empfehle, egal wo du hingehst.

Insbesondere bietet Kapitel 8 ("Funktionale Parser") die wirkliche Grundlage, die Sie benötigen, um mit Monaden zu arbeiten, und ich denke, dass dies der beste Ausgangspunkt ist, gefolgt von Alles über Monaden. (Beachten Sie jedoch in Bezug auf dieses Kapitel die Errata von der Website: Sie können die do Form ohne besondere Hilfe. Vielleicht möchten Sie zuerst über Typklassen lernen und dieses Problem selbst lösen.

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


53



Versuche nicht, alle Monad Tutorials mit lustigen Metaphern zu lesen. Sie werden dich nur noch schlimmer durcheinander bringen.


49



Ich schlage vor, dem beizutreten #haskell irc Kanalund dort Fragen stellen. So habe ich Haskell gelernt. Wenn Sie Real World Haskell wie oben beschrieben durchlaufen, werden Echtzeit-Antworten auf Ihre Fragen sehr hilfreich sein. Viele schlaue Leute auf #haskell schreiben Haskell zum Spaß und für Profit, so dass du viel guten Input bekommst. Versuch es!


30



Das sind meine Favoriten

Haskell: Funktionale Programmierung mit Typen

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

Wirkliche Welt Haskell

   B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
   Published in 2008, 710 pages

22



Kann ich zusätzlich empfehlen Noch ein Haskell-Tutorial als Einleitung.

Eine weitere gute Lernquelle (wahrscheinlich auf mittlerem Niveau), die mir sehr geholfen hat und in den anderen Antworten, soweit ich sehen kann, nicht erwähnt wurde, ist Brent Yorgeys Artclassopedia, die in gefunden werden können Der Monad-Leser (Ausgabe 13) 

Es ist in einem sehr zugänglichen Stil geschrieben und enthält (neben vielen anderen Dingen) folgende einführende Hinweise:

Es gibt zwei Schlüssel zu einem Experten Haskell Hackers Weisheit:

  1. Verstehe die Typen.

  2. Gewinnen Sie eine tiefe Intuition für jede Typklasse und ihre Beziehung zu anderen   Geben Sie Klassen ein, die durch die Vertrautheit mit vielen Beispielen unterstützt werden.

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


18



Versuchen Sie, einfache Programme darin zu schreiben.

Sie können Beispielaufgaben wahrscheinlich in verschiedenen Lehrbüchern finden.

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

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

Danach lesen Sie viel über fortgeschrittene Konzepte (Monaden, Pfeile, IO, rekursive Datenstrukturen), weil Haskell unendlich ist und es viele davon gibt.


13