Ich bin mit dem Programmieren in C und C # vertraut und werde C ++ in Zukunft untersuchen. Ich könnte daran interessiert sein, funktionale Programmierung als ein anderes Programmierparadigma zu untersuchen. Ich mache das aus Spaß, meine Arbeit beinhaltet keine Computerprogrammierung und ist ein wenig inspiriert von der Verwendung von funktionaler Programmierung, die ziemlich früh in Informatikkursen am College gelehrt wird. Die Lambda-Rechnung übersteigt sicherlich meine mathematischen Fähigkeiten, aber ich denke, ich kann mit funktionaler Programmierung umgehen.
Welches von Haskell oder Scheme würde als Einführung in die funktionale Programmierung dienen? Ich verwende Emacs als Texteditor und möchte es in Zukunft einfacher konfigurieren können, was das Erlernen von Emacs Lisp mit sich bringen würde. Mein Verständnis ist jedoch, dass Emacs Lisp sich ziemlich von Schema unterscheidet und auch prozeduraler ist als funktional.
Ich würde wahrscheinlich das Buch "Der kleine Schemer" verwenden, das ich bereits gekauft habe, wenn ich das Schema verfolge (scheint mir ein wenig seltsam, weil ich es nur begrenzt durchblättere). Oder ich würde "Learn You a Haskell for Great Good" verwenden, wenn ich Haskell verfolge. Ich würde mir auch das Intro zu Haskell-Videos von Dr. Erik Meijer auf Channel 9 ansehen.
Anregungen, Feedback oder Input geschätzt.
Vielen Dank.
PS BTW Ich habe auch Zugriff auf F #, da ich Visual Studio 2010 verwende, das ich für die C # -Entwicklung verwende, aber ich denke nicht, dass dies mein Hauptkriterium für die Auswahl einer Sprache sein sollte.
Real World Haskell
Antworten:
Ich würde OCaml empfehlen.
Aus meiner persönlichen Sicht sind Funktionen höherer Ordnung, ein statisches Typensystem sowie algebraische Datentypen und Mustervergleiche die Hauptgrundlage für moderne Funktionsprogrammierungen.
Zwischen einem Schema, einem ML und einem Haskell würde ich das ML wählen, weil ich denke, dass es für diese Definition am relevantesten ist. Schema hat keine statische Typisierung (es gibt Typed Racket, aber es ist nicht für Schema-Anfänger), und Haskell hat zu viele andere Dinge (Monaden, faule Bewertung ...), die, obwohl interessant, die Aufmerksamkeit von der wichtigen Basis ablenken können .
SML und OCaml sind gleichermaßen interessant. Ich bin eher an OCaml gewöhnt, und es hat ein "praktischeres" Gefühl, das schön ist (aber wenn Sie wirklich "praktisch" sein wollen, um Ihre Seele zu verlieren, können Sie auch F # wählen).
Schema und Haskell sind auch sehr interessante Sprachen. Die Betonung des Schemas auf Makros ist interessant, steht jedoch nicht in direktem Zusammenhang mit der funktionalen Programmierung (dies ist ein weiterer Punkt auf der Welt, den Sie unbedingt ausprobieren sollten, ebenso wie Logikprogrammierung, Stack-basierte Sprachen und leistungsorientiertes E).
Haskell ist definitiv eine großartige Sprache und meiner Meinung nach ein Muss für die aufstrebenden Gurus der funktionalen Programmierung. Da die Hauptsprachen von OCaml und Haskell sehr ähnlich sind (mit Ausnahme der für Anfänger ablenkenden faulen Auswertung), ist es einfach, Haskell zu lernen, sobald Sie die Grundlagen von OCaml kennen. Oder besser gesagt, Sie können sich auf die seltsamen Dinge konzentrieren und müssen sich nicht gleichzeitig mit den Grundlagen auseinandersetzen.
Ebenso sollten Sie sich Coq oder Agda ansehen, wenn Sie OCaml und möglicherweise auch Haskell gesehen haben und noch mehr erfahren möchten. Dennoch würden nur wenige Coq oder Agda für eine erste Einführung in die funktionale Programmierung empfehlen ...
Um es klar auszudrücken: Ich denke, das Erlernen von OCaml (oder SML) und dann von Haskell macht Sie zu einem ebenso gut funktionierenden Programmierer wie das direkte Erlernen von Haskell, aber einfacher (oder weniger schmerzhaft).
Außerdem haben OCaml und Haskell beide gute Eigenschaften, die sie voneinander unterscheiden, und es ist interessant, die erweiterten Funktionen von beiden zu kennen . Nur Haskell zu lernen ist in dieser Hinsicht ärmer (obwohl Sie natürlich OCaml nach Haskell lernen könnten; ich denke, es ist weniger logisch und wird Sie mehr frustrieren).
Zum Erlernen von OCaml würde ich Jason Hickeys Buchentwurf (PDF) empfehlen .
¹ Diese Definition ist umstritten. Einige Schema-Leute behaupten, statische Typisierung habe nichts mit funktionaler Programmierung zu tun. Einige Haskell-Leute werden behaupten, dass ihre Definition von Reinheit ("was Haskell tut, aber nicht mehr") eine unabdingbare Voraussetzung dafür ist, eine funktionale Sprache zu sein. Ich bin damit einverstanden, nicht zuzustimmen.
quelle
Wenn Sie sich für die erweiterten Konzepte der funktionalen Programmierung interessieren, entscheiden Sie sich für Haskell. Es gibt ein geeignetes Typensystem und ein striktes Verbot von Mutationen. Trotzdem ist Haskell nichts für schwache Nerven.
Wenn Sie nur eine Einführung in funktionales Design wünschen, entscheiden Sie sich für Schema. Die Syntax ist viel einfacher zu lernen und zu lesen. Es erlaubt zwar eine prozedurale Programmierung, aber disziplinieren Sie sich, keine Prozedur mit einem
!
am Ende des Namens zu verwenden.Mit Scheme können Sie auch die Struktur und Interpretation von Computerprogrammen lesen, die zweifellos die beste Einführung in Programmierparadigmen darstellt. Es gibt Vorträge über das Buch vom MIT und von Berkeley .
quelle
Die richtige Antwort ist natürlich beides! Es ist also nur eine Frage, welche Sprache zuerst behandelt werden soll. Meine Situation ist identisch mit deiner. Ich habe The Little Schemer sehr genossen. Sie werden die grundlegenden Konstrukte der funktionalen Programmierung auf jeden Fall verstehen, wenn Sie diese durchlaufen haben (und einen Platz haben, an dem Sie Ihre Gelee-Flecken platzieren können!).
Ich bin ungefähr ein Viertel in Learn You a Haskell for Great good. Das macht mir auch Spaß, aber die beiden Bücher könnten unterschiedlicher nicht sein. Lernen Sie eine Haskell hat einen sehr traditionellen Ansatz zum Unterrichten einer bestimmten Sprache. Der kleine Schemer ist offensichtlich spezifisch für das Schema, befasst sich jedoch viel mehr mit der Vermittlung der Grundlagen der funktionalen Programmierung und nicht mit der Sprache des Schemas.
Ich empfehle auf jeden Fall mit The Little Schemer zu beginnen. Es ist weniger praktisch, aber grundlegender.
quelle
Meine zwei Schwerpunkte in Bezug auf funktionale Programmierung sind, mich nicht auf eine bestimmte Sprache festzulegen, sondern die Schlüsselkonzepte der funktionalen Programmierung zu erlernen. Ich habe funktionale Programmierung gelernt, indem ich kopfüber in ein Projekt geworfen wurde, in dem mein Chef darauf bestand, dass alle Entwicklungen in APL durchgeführt werden. APL ist eine funktionale Array-Verarbeitungssprache und so weit wie möglich von LISP, Haskell oder anderen gängigen Programmiersprachen entfernt. Der eigentliche Gewinn war, als ich feststellte, dass ich, nachdem ich das funktionale Programmierparadigma "durchgearbeitet" und mental gelernt hatte, ein Problem automatisch in ein funktionales Programm zu zerlegen, nicht länger von den idiomatischen Aspekten anderer funktionaler Sprachen wie Haskell eingeschüchtert war. OCaml, Schema, Scala und Clojure. ICH'
Wenn ich eine erste funktionale Sprache wählen würde, würde ich wahrscheinlich Haskell oder Steel Bank Common Lisp (SBCL) wählen. Für Haskell würde ich Learn You a Haskell ... , Real World Haskell , Die Haskell-Straße zu Logik, Mathematik und Programmierung und Perlen des funktionalen Algorithmusdesigns lesen . Für CL würde ich " Land of Lisp" , Paradigmen der Programmierung künstlicher Intelligenz , und (wenn Sie wirklich hardcore sind) " Let over Lambda" lesen . Sie können all diese Bücher kombinieren, um einen umfassenden Überblick über praktische Ansätze und Konzepte der funktionalen Programmierung zu erhalten.
Ich würde auch in Betracht ziehen, Clojure und Scala zu lernen, da beide sehr gute und sehr ausdrucksstarke funktionale Sprachen sind (ungeachtet dessen, was der FP-Purist sagen könnte).
quelle
Ich stimme dem Punkt "beide lernen" zu, aber es gibt noch ein paar Punkte, die bisher nicht erwähnt wurden. Zuallererst müssen Sie, wenn Sie neu in der funktionalen Programmierung sind und sich für Haskell entscheiden, neben FP einige neue Dinge beachten: Sie müssen lernen, in einer faulen Umgebung zu leben, die einen erheblichen Aufwand verursachen kann, und Sie müssen um mit einem "echten" Typsystem umzugehen, das sehr weit von dem entfernt sein kann, was Sie in C oder C # verwenden.
Schema, OTOH, hat eine fremd aussehende Syntax, aber es gibt kein statisches Typensystem, das gelernt werden muss, und es ist eine strenge Sprache, damit die Dinge vertrauter sind. Darüber hinaus sind Schemaimplementierungen in der Regel sehr flexibel. Racket bringt dies beispielsweise auf ein Minimum und bietet eine faulere und eine statisch typisierte Variante. Dies bedeutet, dass Sie mit dem "einfachen" Teil beginnen und den Dreh und Angelpunkt einer funktionalen Sprache finden. Später können Sie sich selbst erweitern und die typisierte und die faule Variante verwenden. Sie sollten jetzt einfacher sein, da Sie sich immer nur mit einer Funktion befassen müssen. Um klar zu sein, die Konzeptewerden neu genug sein, dass das syntaktische Problem geringfügig und größtenteils irrelevant sein wird. Mit anderen Worten, sobald Sie mit den neuen Konzepten beginnen, sind Sie so beschäftigt, dass die Syntax einfach verschwindet. (Und wenn Sie sich wirklich für Syntax interessieren, dann ist Haskells Syntax etwas, das ich persönlich für sehr elegant halte - aber das liegt daran, dass es auch sehr weit von Ihrer durchschnittlichen C / C # / C ++ - Syntax entfernt ist.)
Aber nachdem ich das alles gesagt habe, denke ich, dass es auch einen guten Punkt für F # gibt - Sie sagen, dass Sie dies als Nebensache tun, aber wenn Sie FP lernen, werden Sie bald all dieses gute Zeug verwenden wollen. Die Verwendung von F # bedeutet, dass Sie mehr "echte" Dinge tun können, da es wahrscheinlich einfach ist, die gleichen Probleme zu lösen, mit denen Sie sich in Ihrer täglichen Arbeit befassen. Im Idealfall werden Sie an einen Punkt gelangen, an dem Sie den Vorteil erkennen, dass Sie diesen Punkt gegenüber C # verwenden und ihn in einem bestimmten Projekt verwenden. So , während Sie rechts in nicht Auswahl nur F # , weil es einfacher für Sie , den Zugang, sollten Sie es betrachten , da gibt es nichts Besseres , als tatsächlich mitdiese neuen Konzepte. Wenn Sie dagegen Scheme oder Haskell verwenden und es als Spielzeugsprache für Ihren Zweck betrachten (auch wenn Sie wissen, dass einige Leute es für echte Anwendungen verwenden), nehmen Sie die gesamte FP-Sache niemals zu ernst. [Aber YMMV basiert hauptsächlich auf subjektiven Beobachtungen und kann von Person zu Person sehr unterschiedlich sein.]
quelle
Gibt es einen Grund, warum ML nicht zu Ihren Optionen gehört? Es gibt eine ganze Reihe von Einführungsmaterialien, darunter Bücher und Kursunterlagen. Wenn Sie The Little Schemer mögen, könnte Ihnen auch The Little MLer gefallen. Schließlich können Sie später problemlos zu F # wechseln. (Nicht, dass ich Haskell oder Scheme anklopfe - lernen Sie im Idealfall alle drei).
Auch ein Wort der Warnung vor Emacs Lisp. Ich glaube nicht, dass Haskell oder ML Sie darauf vorbereiten werden. Eine Lispy-Sprache wie Scheme wird helfen, aber es gibt immer noch große Unterschiede, z. Variablen mit dynamischem Gültigkeitsbereich. Emacs-Erweiterungen sind ihrer Natur nach eher zwingend als funktional - es geht nur darum, den Status des Editors zu ändern.
quelle
Schreiben Sie sich ein Schema in 48 Stunden (in haskell)
Ich kann das wirklich empfehlen. Sie lernen Haskell anhand eines realen und interessanten Problems und lernen die beste Lektion des Schemas, wenn Sie mit dem von Ihnen erstellten Interpreter spielen. Wenn Sie diese Route wählen, sollten Sie ein paar gute Haskell-Einführungen behalten. Sie werden sie besser verstehen, wenn Sie ein Problem zu lösen haben.
quelle
Ich würde mit Haskell gehen. In Schema können geschoben werden Sie prozedurale Dinge zu tun, und seine Art System ist nicht annähernd so hilfreich hat Haskell, das ist toll für einen Anfänger , da es ziemlich überprüft , dass der Code während der Kompilierung korrekt ist.
quelle
Ich denke, es ist einfach, in Debatten über Sprachen verwickelt zu werden und den Punkt zu verfehlen. Für jemanden, der nur lernen möchte, worum es in FP geht, sind die Unterschiede zwischen Ocaml / ML / Scheme / Haskell nicht halb so wichtig wie Ihr Komfort mit dem Material (Bücher, Videos, Tools), das Sie verwenden, um es zu lernen. Und ob Sie einen Freund haben oder nicht, der Ihnen beim Erlernen bestimmter Sprachen hilft, übertrumpft alles andere.
quelle
Wenn es nicht rein ist, können Sie auch eine imperative Sprache verwenden, so Haskell.
quelle
In einer der Antworten, die Sie auf Ihre Frage erhalten haben, fand ich diesen Link sehr interessant, da er Ihnen einen Vorgeschmack auf Haskell und Scheme gibt.
Zusätzlich zu diesem tollen Link möchte ich Ihre Frage beantworten.
Wenn Sie einen zwingenden Programmierhintergrund haben, werden Sie möglicherweise große Anstrengungen unternehmen, um funktionale Programmierung zu erlernen. Ich würde sicherstellen, dass die Lernerfahrung nicht leer ist. Das heißt, Sie können es auf Ihren aktuellen oder nächsten Job anwenden oder es wird Ihnen auf andere Weise helfen.
Es gibt viele gute Sprachen. Die Scala-Leute würden ihre Sprache preisen, ebenso wie die Clojure- und CL-Leute. Sogar Pythonisten behaupten Faulheit. Andere Leute, die dir geantwortet haben, haben ML vorgeschlagen. Amit Rathore, der Clojure in Action geschrieben hat, könnte sogar vorschlagen, dass Sie Haskell lernen.
Sie erwähnten Windows und F #. Hilft Ihnen das in Ihrer jetzigen Position? Ich weiß nichts über F #. Ist es funktionsfähig genug? Ich frage das, weil IMHO Python funktionale Konstrukte hat, aber es ist nicht wie das Programmieren in Clojure.
Zusammenfassend lässt sich sagen, dass Sie eine funktionale Sprache lernen, die "wirklich" funktioniert und dabei für Ihre Situation am sinnvollsten ist.
quelle
Aus der Sicht eines relativen Anfängers schlage ich vor, nicht mit SICP zu beginnen, wenn Sie sich für ein Schema entscheiden, es sei denn, Ihre Mathematik ist ziemlich ausgereift. Das Buch und die Videos sind voller Feinheiten und für Anfänger überhaupt nicht intuitiv.
quelle