it-swarm-eu.dev

Schema vs Haskell für eine Einführung in die funktionale Programmierung?

Ich bin mit dem Programmieren in C und C # vertraut und werde C++ in Zukunft erforschen. Ich könnte daran interessiert sein, funktionale Programmierung als ein anderes Programmierparadigma zu untersuchen. Ich mache das zum Spaß, mein Job beinhaltet keine Computerprogrammierung und ist etwas inspiriert von der Verwendung von funktionaler Programmierung, die ziemlich früh in Informatikkursen am College unterrichtet wird. Der Lambda-Kalkül geht sicherlich über meine mathematischen Fähigkeiten hinaus, aber ich denke, ich kann mit funktionaler Programmierung umgehen.

Welches von Haskell oder Schema würde als gute 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 erforderlich machen würde. Mein Verständnis ist jedoch, dass Emacs LISP sich ziemlich vom Schema unterscheidet und auch prozeduraler als funktionaler Natur ist.

Ich würde wahrscheinlich das Buch "The Little Schemer" verwenden, das ich bereits gekauft habe, wenn ich Scheme verfolge (scheint mir etwas seltsam, weil ich nur begrenzt darin blättere). Oder würde das "Learn You a Haskell for Great Good" verwenden, wenn ich Haskell verfolge. Ich würde mir auch die Intro to Haskell-Videos von Dr. Erik Meijer auf Kanal 9 ansehen.

Anregungen, Feedback oder Anregungen sind willkommen.

Vielen Dank.

P.S. Übrigens habe ich auch Zugriff auf F #, da ich Visual Studio 2010 habe, das ich für die C # -Entwicklung verwende, aber ich denke nicht, dass dies mein Hauptkriterium für die Auswahl einer Sprache sein sollte.

36
haziz

Ich würde OCaml empfehlen.

Aus meiner persönlichen Sicht sind die Funktionen moderner Funktionen, ein statisches Typsystem sowie algebraische Datentypen und Mustervergleiche die Hauptgrundlage moderner funktionaler Programmierungen.

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. Das Schema hat keine statische Typisierung (es gibt Typed Racket, aber es ist nicht für Anfänger des Schemas), und Haskell hat zu viele andere Dinge (Monaden, faule Bewertung ...), die zwar interessant sind, aber 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" wollen, um Ihre Seele zu verlieren, können Sie auch F # wählen).

Schema und Haskell sind ebenfalls sehr interessante Sprachen. Die Betonung des Schemas auf Makros ist interessant, steht jedoch nicht in direktem Zusammenhang mit der funktionalen Programmierung (dies ist ein weiteres Thema auf der Welt, das Sie unbedingt ausprobieren sollten, sowie Logikprogrammierung, stapelbasierte Sprachen und fähigkeitsorientiertes E).

Haskell ist definitiv eine großartige Sprache und meiner Meinung nach ein obligatorischer Punkt für die aufstrebenden Gurus der funktionalen Programmierung. Da die Kernsprachen von OCaml und Haskell sehr ähnlich sind (mit Ausnahme einer faulen Bewertung, die den Anfänger ablenkt), ist es einfach, Haskell zu lernen, sobald Sie die Grundlagen von OCaml kennen. Oder besser gesagt, Sie können sich auf das Seltsame konzentrieren und müssen nicht gleichzeitig die Grundlagen aufnehmen.

Wenn Sie OCaml und möglicherweise auch Haskell gesehen haben und noch mehr erfahren möchten, sollten Sie sich Coq oder Agda ansehen. Dennoch würden nur wenige Coq oder Agda für eine erste Einführung in die funktionale Programmierung empfehlen ...

Um meinen Standpunkt klar zu machen: Ich denke, dass das Erlernen von OCaml (oder SML) und dann von Haskell Sie zu einem ebenso funktionalen Programmierer macht wie das direkte Erlernen von Haskell, aber einfacher (oder weniger schmerzhaft).
Außerdem haben OCaml und Haskell beide gute Unterschiede, und es ist interessant, die erweiterten Funktionen von beider zu kennen. Nur Haskell zu lernen ist in diesem Aspekt schlechter (obwohl Sie OCaml natürlich nach Haskell lernen könnten; ich denke, es ist weniger logisch und wird Sie frustrierter machen).

Zum Erlernen von OCaml würde ich empfehlen Jason Hickeys Buchentwurf (PDF) .

¹diese Definition ist umstritten. Einige Scheme-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 ist, um eine funktionale Sprache zu sein . Ich bin damit einverstanden, nicht zuzustimmen.

28
gasche

Wenn Sie an den fortgeschritteneren Konzepten der funktionalen Programmierung interessiert sind, dann 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 das funktionale Design wünschen, wählen Sie Schema. Die Syntax ist viel einfacher zu lernen und zu lesen. Es erlaubt prozedurale Programmierung, aber disziplinieren Sie sich einfach, 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 zu dem Buch von MIT und Berkeley .

26
Hoa Long Tam

Die richtige Antwort ist natürlich beides! Es ist also nur eine Frage, welche Sprache zuerst angegangen werden muss. Meine Situation ist identisch mit deiner. Ich habe The Little Schemer sehr genossen. Sie werden auf jeden Fall die grundlegenden Konstrukte der funktionalen Programmierung verstehen, nachdem Sie dies durchlaufen haben (und einen Platz haben, an dem Sie Ihre Gelee-Flecken platzieren können!).

Ich bin ungefähr ein Viertel von Learn You a Haskell for Great Good. Ich genieße das auch ziemlich, aber die beiden Bücher könnten unterschiedlicher nicht sein. Learn You a Haskell hat einen sehr traditionellen Ansatz, um eine bestimmte Sprache zu unterrichten. Das kleine Schema ist natürlich spezifisch für das Schema, befasst sich jedoch viel mehr mit der Vermittlung der Grundlagen der funktionalen Programmierung, nicht mit der Sprache des Schemas.

Ich empfehle auf jeden Fall, mit The Little Schemer zu beginnen. Es ist weniger praktisch, aber grundlegender.

17
DaveGauer

Meine zwei Cent in Bezug auf funktionale Programmierung sind, mich nicht auf eine bestimmte Sprache festzulegen, sondern die Schlüsselkonzepte der funktionalen Programmierung zu lernen. Ich lernte funktionale Programmierung, indem ich kopfüber in ein Projekt geworfen wurde, in dem mein Chef darauf bestand, dass alle Entwicklungen in APL durchgeführt wurden. APL ist eine funktionale Array-Verarbeitungssprache und so weit wie möglich von LISP, Haskell oder einer anderen gängigen Programmiersprache entfernt. Die wirkliche Auszahlung war, als ich feststellte, dass ich mich nicht mehr von den idiomatischen Aspekten anderer funktionaler Sprachen wie Haskell einschüchtern ließ, nachdem ich das Paradigma der funktionalen Programmierung "durchgearbeitet" und mental gelernt hatte, ein Problem automatisch auf magische Weise in ein funktionales Programm zu zerlegen. OCaml, Scheme, Scala und Clojure. Seitdem war ich ziemlich erfolgreich darin, mich mit anderen funktionalen Sprachen vertraut zu machen, und habe in OCaml, Scala und SBCL ziemlich guten Code für kommerzielle Qualität geschrieben.

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 lesen Learn You a Haskell ..., Real World Haskell, Der Haskell-Weg zu Logik, Mathematik und Programmierung, und Perlen des funktionalen Algorithmusdesigns. 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 funktionale Programmieransätze und -konzepte zu erhalten.

Ich würde auch in Betracht ziehen, Clojure und Scala zu lernen, da beide für sich genommen sehr gute und sehr ausdrucksstarke funktionale Sprachen sind (trotz dessen, was FP Purist sagen könnte).

17
Marc

Ich stimme dem Punkt "beides lernen" zu, aber es gibt noch ein paar Punkte, die bisher nicht erwähnt wurden. Wenn Sie mit funktionaler Programmierung noch nicht vertraut sind und sich für Haskell entscheiden, müssen Sie sich neben FP zunächst einigen neuen Dingen stellen: Sie müssen lernen, wie man in einer faulen Umgebung lebt, die einen erheblichen Aufwand erfordern kann, und Sie müssen um mit einem "echten" System 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 Typsystem zum Lernen, und es ist eine strenge Sprache, damit die Dinge vertrauter sind. Darüber hinaus sind Schema-Implementierungen in der Regel sehr formbar - zum Beispiel Racket bringt das auf das Äußerste und bietet eine faule und eine statisch typisierte Variante. Dies bedeutet, dass Sie mit dem "einfachen" Zeug beginnen und den Dreh raus bekommen können, eine funktionale Sprache zu verwenden. Später können Sie sich weiterentwickeln und die typisierte und die faule Variante verwenden. Sie sollten jetzt einfacher sein, da Sie sich jeweils mit einer Funktion befassen können. Um klar zu sein, die Konzepte werden 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 die Syntax von Haskell etwas, das ich persönlich für sehr elegant halte - aber das liegt daran, dass sie 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 lernen, FP, werden Sie bald verwenden wollen) all diese guten Dinge. Wenn Sie F # verwenden, können Sie mehr "echte" Dinge tun, da es wahrscheinlich einfach ist, die gleichen Probleme zu lösen, mit denen Sie sich in Ihrer täglichen Arbeit befassen. Idealerweise kommen Sie an einen Punkt, an dem Sie d sehen Sie den Vorteil, dass Sie dies beispielsweise gegenüber C # verwenden - und verwenden Sie es in einem Projekt. Wenn Sie also nicht nur F # wählen, weil es für Sie einfacher ist, darauf zuzugreifen, sollten Sie es in Betracht ziehen, da es nichts Besseres gibt als tatsächlich Verwenden von diesen neuen Konzepten. Im Gegensatz dazu, wenn Sie Scheme oder Haskell verwenden und es als Spielzeugsprache für Ihren Zweck betrachten (selbst wenn Sie wissen, dass einige Leute es verwenden es für reale Anwendungen), dann werden Sie das Ganze nie zu ernst nehmen FP Sache. [Aber YMMV, es basiert hauptsächlich auf subjektiven Beobachtungen und kann von Person zu Person sehr unterschiedlich sein.]

6
Eli Barzilay

Schreibe dir ein Schema in 48 Stunden (in haskell)

Ich kann das nur empfehlen. Sie lernen Haskell anhand eines echten und interessanten Problems und lernen die beste Lektion des Schemas, wenn Sie mit dem von Ihnen erstellten Interpreter spielen. Wenn Sie diesen Weg gehen, halten Sie ein paar gute Haskell-Einführungen bereit. Sie werden sie besser verstehen, wenn Sie ein Problem zu lösen haben.

6
John F. Miller

Gibt es einen Grund, warum ML nicht zu Ihren Optionen gehört? Es gibt eine ganze Menge Einführungsmaterial, einschließlich Bücher und Kursunterlagen. Wenn Sie The Little Schemer mögen, können Sie auch The Little MLer genießen. Schließlich können Sie später problemlos zu F # übergehen. (Nicht, dass ich Haskell oder Scheme anklopfe - lerne idealerweise 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 von Natur aus eher zwingend als funktional - es geht darum, den Status des Editors zu ändern.

6
petebu

Ich würde mit Haskell gehen. Im Schema werden Sie möglicherweise dazu gedrängt, prozedurale Aufgaben zu erledigen, und das Typensystem ist bei weitem nicht so hilfreich wie das von Haskell, was für Anfänger großartig ist, da es beim Kompilieren ziemlich genau überprüft, ob Ihr Code korrekt ist Zeit.

4
alternative

Ich denke, es ist leicht, in Debatten über Sprachen verwickelt zu werden und den Punkt zu verfehlen. Für jemanden, der nur lernen möchte, worum es bei FP geht), sind die Unterschiede zwischen Ocaml/ML/Scheme/Haskell nicht halb so wichtig wie Ihr Komfort mit dem Material (Bücher, Videos, Werkzeuge). Sie lernen es. Und ob Sie einen Freund haben, der Ihnen hilft, bestimmte Sprachen zu lernen, übertrumpft alles andere.

1
autodidakto

In einer der Antworten, die Sie auf Ihre Frage erhalten haben, fand ich dieser Link ziemlich interessant, weil es Ihnen einen Vorgeschmack auf Haskell und Scheme gibt.

Zusätzlich zu diesem raffinierten Link ist hier meine Sicht auf Ihre Frage.

Wenn Sie einen zwingenden Programmierhintergrund haben, werden Sie möglicherweise viel Aufwand in das Erlernen der funktionalen Programmierung investieren. Ich würde sicherstellen, dass die Lernerfahrung nicht leer ist. Das heißt, dass Sie es auf Ihren aktuellen oder nächsten Job anwenden können oder dass es Ihnen auf andere Weise hilft.

Es gibt viele gute Sprachen da draußen. Die Leute von Scala] würden ihre Sprache preisen, ebenso wie die Leute von Clojure und CL. Sogar Pythonisten behaupten Faulheit. Andere Leute, die Ihnen geantwortet haben, schlugen ML vor. Amit Rathore die Clojure geschrieben haben in Aktion könnte sogar vorschlagen, dass Sie Haskell lernen.

Sie haben Windows und F # erwähnt. Hilft Ihnen das in Ihrer aktuellen Position? Ich weiß nichts über F #. Ist es funktional genug? Ich frage das, weil IMHO Python hat funktionale Konstrukte, aber es ist nicht wie Programmieren in Clojure.

Zusammenfassend lernen Sie eine funktionale Sprache, die "wirklich" funktional ist und dabei für Ihre Situation am besten Sinn macht.

0
octopusgrabbus

Wenn es nicht rein ist, können Sie auch eine imperative Sprache verwenden, so Haskell.

0
pyon