Funktional als Muttersprache


Antworten:


16

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.


Um fair zu sein, eine ganze Reihe von Sprachen enthält immer mehr funktionale Aspekte, so dass das Leben nicht mehr so ​​schlecht ist, wie es früher war.
Tikhon Jelvis

Es stimmt, und für jemanden, der FP liebt, ist dies nichts als eine gute Sache
Zachary K

3
Ich weiß - ich schlage dies als guten Grund vor, zuerst FP zu lernen. Es ist ein Trend, der mich schon eine Weile sehr glücklich macht.
Tikhon Jelvis

Sagt nicht wirklich viel, um die Frage zu beantworten - warum magst du Haskell (oder Schema)? Wären sie gut als erste Sprachen zum Lernen? Warum?
jimwise

Einige Kommentare zu beiden Sprachen hinzugefügt
Zachary K

6

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.


1
An meiner Universität haben wir zunächst mit einer funktionalen Sprache, Standard ML, begonnen und gelernt, welche Nebenwirkungen auftreten. Danach haben wir C gelernt, aber nie C ++.
Jonas

@Jonas. Ich denke, verschiedene Länder / Universitäten haben sehr unterschiedliche Kursstrukturen. An meiner Universität ist C gefolgt von C ++ ein Standard für Englischkurse in der Informatik, aber für andere Ingenieurwissenschaften wird nur C unterrichtet.
DPD

An meiner Universität fangen wir mit Java an und verwenden dann einfach die Sprache, die für die Kurse danach geeignet ist. Zum Beispiel wird C / C ++ für die Systemprogrammierung verwendet, C # für die Benutzeroberfläche, verschiedene Assemblersprachen für die Computerorganisation und ich denke, was auch immer Sie für die Spieleprogrammierung wollen
Carson Myers

An meiner Universität haben wir angefangen, Scheme (mit SICP) zu lernen. Die ersten Wochen waren voll funktionsfähig; OOP wurde gut in den Kurs eingeführt. Ich fand, dass alles sehr gut angelegt war und mochte den Kurs lieber.
Tikhon Jelvis

6

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.


5

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 foldfunktioniert, 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.


Fast vergessen: Wenn Sie Reich der Schläger kaufen möchten, versuchen Sie diesen Gutschein: RACKETEERS. Ich bin mir nicht sicher, wann es abläuft, sorry.
Bug

+1 für die Erwähnung von Funktionen höherer Ordnung - Ich war bereit, meine eigene Antwort darüber zu veröffentlichen. Die Hälfte meiner Mitarbeiter kämpft mit dem Konzept, und die anderen, die sie bekommen, denken nicht an sie, wenn es die einfachste Lösung wäre.
Izkata

1
Ich hatte noch nie von Realm of Racket gehört, wusste aber vom Titel sofort, was es war, denn der Titel ist ein Hinweis auf seinen älteren Bruder, Land of Lisp.
Magus

4

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


2

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.


1
Ich denke, deine Annahmen sind falsch. Es gibt gute Tutorials, Bücher, Artikel usw. über funktionale Dinge. Darüber hinaus gibt es viele Artikel, die sich mit speziellen Dingen wie Typsystem, Implementierung, virtuellen Maschinen, Lambda-Kalkulation usw. befassen.
Ingo

1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.