Antworten:
Ein Hauptproblem ist, dass, wenn Sie mit einer Sprache wie Haskell anfangen, alles andere nur minderwertig erscheint.
Ehrlich gesagt halte ich es für eine großartige Idee, mit einer Sprache wie Haskell oder Schema zu beginnen.
(Ich gebe zu, dass ich süchtig nach funktionaler Sprache bin)
OK, was ich an beiden Sprachen mag:
Schema nimmt eine sehr einfache Sprache und baut daraus eine wunderbar robuste Sprache für die Entwicklung auf. Auch SICP ist über Schema geschrieben, das es lohnt, genau dort zu lernen. Schema ist über die einfachste Sache, die Sie sich vorstellen können, dass eine vollständige Sprache sein könnte.
Haskell Was wirklich an mir wächst, ist das Typensystem. So viele der Fehler, die ich in anderen Sprachen sehe, sind auf den falschen Typ zurückzuführen, der irgendwo auftaucht. In Haskell ist das fast unmöglich. Auch die Idee einer faulen Sprache hat einfach ein paar coole Sachen draus. Beispielsweise können Sie in Haskell unendliche Datenstrukturen erstellen und dann nur das Teil erstellen, das Sie benötigen.
Das größte Plus beim Erlernen einer funktionalen Sprache vor dem Erlernen einer OOP-Sprache ist, dass Ihre Programmierkenntnisse zuerst entwickelt werden und Sie dann die OOP-Konzepte leicht verstehen können. Wenn Sie direkt mit einer OOP-Sprache beginnen, müssen Sie zwei Dinge gleichzeitig lernen: "über den Code nachdenken" und "über die OOD nachdenken". Es kann ablenken. Üben Sie zunächst mit einer funktionalen Sprache und entwickeln Sie Ihre Programmierkenntnisse. Dann lerne OOP und andere Paradigmen. Da OOP die Defizite in der strukturellen Programmierung ausgleichen wollte, wird es leichter zu verstehen sein, warum. Das ist der Grund, warum CS-Kurse mit C beginnen und dann mit C ++ fortfahren.
Zu der Frage, wie man das Programmieren lernt, indem man mit funktionaler Programmierung beginnt, zwei klassische Empfehlungen:
Die erste und naheliegende ist die klassische Struktur und Interpretation von Computerprogrammen von Abelson und Sussman, die eine der besten Einführungen in CS darstellt und aus funktionaler Sicht unter Verwendung von Scheme vermittelt wird. Es ist vollständig online verfügbar . Wenn Sie hier nicht anfangen, sollten Sie hier irgendwann ankommen.
Ein neuerer Text, der den größten Teil desselben Themas in einem sanfteren Tempo und mit einem stärkeren Schwerpunkt auf Softwareentwicklung abdeckt, ist How to Design Programs von Matthew Felleisen und einer Reihe anderer Mitarbeiter des Racket / PLT-Teams, die den Racket-Dialekt von verwenden Planen. Es ist auch online verfügbar , ebenso wie die in Bearbeitung befindliche zweite Ausgabe . Dieses Buch hat den Vorteil, dass es für die Verwendung mit der DrRacket-Programmierumgebung entwickelt wurde, die Anfängern und Experten eine sehr benutzerfreundliche Oberfläche zum Experimentieren mit Code bietet.
Auf die Frage, warum mit funktionaler Programmierung begonnen wird, möchte ich auf Bob Harpers Blog verweisen . Carnegie Mellon hat kürzlich sein CS-Curriculum umgerüstet, um zunächst funktionales Programmieren zu lehren, und Harper hat in seinem Blog über ihre Fortschritte berichtet. Als einer der Macher der Definition von Standard ML ist es offensichtlich, dass er für diesen Schritt ist, und er argumentiert die Gründe dafür gut.
Schließlich würde ich davor warnen, zuerst Haskell zu lernen, obwohl andere vielleicht anderer Meinung sind. Während Haskells reine Herangehensweise an FP zweifellos gute Gewohnheiten hervorbringt, ist der Fokus der Sprache auf verzögertes Rechnen nicht unbedingt eine gute Ergänzung für den Anfänger. Eines der ersten und wichtigsten Dinge, die Sie als Programmierer lernen müssen, ist, anhand der Quelle genau zu überlegen, was Ihr Programm tut, und die relativen Kosten verschiedener Ansätze für dasselbe Problem zu ermitteln. Ich habe die Erfahrung gemacht, dass Haskells Faulheit diese beiden Aktivitäten zu einer Herausforderung für selbst erfahrene Programmierer macht, obwohl Your Mileage May Vary.
Der Hauptvorteil (oder nicht der Nachteil) des Einstiegs in FP besteht darin, dass die meisten Konzepte auch für die imperative Programmierung gelten können. Realm of Racket verwendet Videospiel-Analogien, um sowohl funktionale als auch zwingende Konzepte zu vermitteln, und engagierte Schüler verfügen nicht nur über ein funktionales Spiel (npi), sondern auch über ein solides Verständnis für Bedingungen, Rekursion, Schleifen, ADTs und ereignisgesteuertes Design. Diese Konzepte sind in der modernen Programmierung praktisch allgegenwärtig und werden ständig verwendet.
Noch wichtiger ist es jedoch, zu lernen, wie man Abstraktionen codiert , was FP durch die Verwendung von Funktionen und Datentypen höherer Ordnung auszeichnet. How to Design Programs verfolgt einen einzigartigen Ansatz, indem es durch Induktion unterrichtet. Zum Beispiel lernen die Schüler, wie es fold
funktioniert, indem sie den Code für die Summe und das Produkt einer Liste betrachten, ihre Gemeinsamkeiten finden und die Implementierung selbst ableiten.
Das OOP-Äquivalent des oben genannten würde wahrscheinlich eines oder mehrere der folgenden Elemente umfassen: Schnittstellen, abstrakte Klassen, Generika, Funktoren oder (wenn Sie es falsch machen) Singletons. Obwohl dies in Java durchaus akzeptable Entwurfsmuster sind, gehören sie meiner Meinung nach nicht in einen einführenden Lehrplan und dienen nur dazu, die zugrunde liegenden Prinzipien zu verschleiern. Selbst als jemand, der "spät" in die FP-Sprachen eingeführt wurde, kann ich sagen, dass das Navigieren im sich ständig verändernden Meer von OOP durch einen starken funktionalen Anker erheblich erleichtert wurde.
RACKETEERS
. Ich bin mir nicht sicher, wann es abläuft, sorry.
Funktionale Programmierung erleichtert die Arbeit erheblich. In OOP-Sprachen müssen Sie den Status über mehrere Threads hinweg verwalten, ohne diesen Status zu ruinieren. In funktionalen Sprachen müssen Sie sich keine Sorgen machen, wenn der Großteil der Arbeit von reinen Funktionen erledigt wird.
In Bezug auf Geschwindigkeit / Leistung bin ich kein echter Leistungsjockey, aber funktional zu sein bedeutet nicht, langsam zu sein, und die Struktur funktionaler Sprachen hat wenig mit ihrer Geschwindigkeit zu tun. Die Syntax der funktionalen Sprachen ist sehr unterschiedlich, z. B. die Unterschiede zwischen Clojure und Haskell. Clojure ist sehr schnell wie es ist und kann die Geschwindigkeit von Java mit einer nachträglichen Optimierung erreichen (und manchmal sogar übertreffen).
Es kommt also wirklich darauf an, wonach Sie suchen
Ich denke, dass die Verfügbarkeit von Lernmaterial, einigen guten Codebeispielen und Mentoren beim Erlernen von Programmiersprachen sehr wichtig ist. Abhängig von Ihrer Situation haben Sie vielleicht einen Mentor, der Ihnen etwas beibringen kann, aber meiner Meinung nach gibt es im Vergleich zu den gängigen Sprachen nur sehr wenige funktionale Sprachressourcen. Dies bedeutet, dass Sie im Vergleich zum Erlernen von Standardsprachen langsamer vorankommen. Aber wenn Sie es nicht eilig haben, ist dies kein Problem.
Der vielleicht wichtigste Grund, funktionale Programmiersprachen zu lernen, ist das Verständnis algebraischer Datentypen. Das mentale Mapping hilft bei der Modellierung von OO-Klassenbeziehungen und sogar beim Datenbankdesign.
Der Schwerpunkt auf Multi-Core / Multi-Prozessor-Systemen liegt auf der Verwendung paralleler Algorithmen, die in FP klarer und präziser ausgedrückt werden können. Der Lambda-Zweig der Sprachen wird in den nächsten ein bis zwei Jahrzehnten wahrscheinlich stark zunehmen.
Es gibt aber auch einige häufige Fallstricke. Zu glauben, dass FP einfacher ist, ist ein großer Fehler, da das Berechnen der räumlichen und zeitlichen Komplexität sowie das Liefern von Beweisen für das Anhalten im Lambda-Kalkül viel schwieriger sein kann, insbesondere in Sprachen, die eine verzögerte Auswertung unterstützen.
Also, lerne beides! Oder vielleicht besser: Lernen Sie zuerst eine Sprache, die beides umfasst, wie Scala. Wenn Sie nichts dagegen haben, T-Shirts zu binden und einen leichten holländischen Akzent zu setzen, finden Sie vielleicht die FP-Vorträge von Dr. Erik Meijer nützlich, die auf MSDN sind.