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

36

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.

haziz
quelle
3
Vergessen Sie nichtReal World Haskell
Alternative
14
Nebenbemerkung: Die Lambda-Rechnung ist ein außerordentlich einfaches System; Das Coole daran ist nicht, dass es komplex ist, sondern das Gegenteil. dass Sie in einem so einfachen System alles ausdrücken können, was Sie wollen. Beginnen Sie mit einer Programmiersprache. Werfen Sie jetzt ALLES aus, außer Variablenreferenzen, Funktionsdefinitionen und Funktionsaufrufen. Voila! Lambda-Kalkül.
9
Ich kann Ihnen in fünf Minuten Lambda-Kalkül beibringen. Jetzt dauert es ein Leben, die Konsequenzen dessen zu verstehen, was Sie gerade gelernt haben. :)
5
Ich habe Haskell dem Schema vorgezogen, weil es nicht so viele verdammte Klammern hat!
Joey Adams

Antworten:

27

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.

Robert Harvey
quelle
3
Danke, dass du mich zu OCaml gestupst hast, und ja, ich werde meine Seele aufs Spiel setzen und F # erforschen. Ich entwickle zwar für Linux, Mac OS X und Windows (hauptsächlich das erstere), aber FSI scheint für alle drei Plattformen (mit Mono unter Linux und Mac OS X) verfügbar zu sein, was ich bereits mache. Die Tatsache, dass das volle Gewicht von Microsoft hinter einer funktionalen Programmiersprache (wenn auch einer "unreinen") steckt, sollte von Fans der funktionalen Programmierung eher begrüßt als verurteilt werden.
Haziz
SML ist tot, ocaml existiert, um coq
permeakra 21.08.12
1
+1 für ML; es ist klarer als Haskell.
m3th0dman
Ich finde es auch eine gute Idee, SML oder OCaml zu lernen, dann Haskell (+1). Nach Kenntnis dieser Sprachen ist es sehr einfach, eine andere Sprache (z. B. Scala) zu erlernen. Zusätzlich könnte man Schema, Common Lisp und Clojure (in dieser Reihenfolge) betrachten, um ein Gefühl für die dynamischen Sprachen zu bekommen.
Giorgio
@haziz: Auch wenn sie gute Software erstellen, bleibt Microsoft (oder im Übrigen Oracle usw.) ein Monopolist mit allen damit verbundenen schlechten Praktiken wie Kundenbindung, inkompatiblen Formaten, inkompatiblen Implementierungen usw.
Giorgio,
26

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 .

Hoa Long Tam
quelle
4
"Die Syntax ist viel einfacher zu lernen und zu lesen" ist sehr subjektiv.
6
@luqui: Stimmt. Vielleicht ist "regelmäßig" ein besseres Wort. Keine Backticks, Infixes, Prioritäten oder Assoziativitätsprobleme - nur Klammern, viele höllische, alberne Klammern.
Hoa Long Tam
17

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.

DaveGauer
quelle
17

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).

Marc
quelle
6

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.]

Eli Barzilay
quelle
6

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
Danke, dass du mich in Richtung ML / OCaml gestupst hast, und ja, ich werde "meine Seele aufs Spiel setzen" und F # erforschen. Ich entwickle zwar für Linux, Mac OS X und Windows (hauptsächlich das erstere), aber FSI scheint für alle drei Plattformen (mit Mono unter Linux und Mac OS X) verfügbar zu sein, was ich bereits mache. Die Tatsache, dass das volle Gewicht von Microsoft hinter einer funktionalen Programmiersprache (wenn auch einer "unreinen") steckt, sollte von Fans der funktionalen Programmierung eher begrüßt als verurteilt werden.
Haziz
Übrigens habe ich The Little MLer bei Amazon bestellt und bereits erhalten und bin auf meine Reise gegangen. Ich habe meiner Bibliothek auch gerade Learning F # hinzugefügt. Scheint eine allgemeinere Anleitung zu sein, mit der ich The Little MLer ergänzen werde.
Haziz
6

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.

John F. Miller
quelle
Ich habe dieses Wiki / PDF tatsächlich verwendet, um Haskell zu lernen und meine OCaml-Kenntnisse aufzufrischen (indem ich Haskell in OCaml übersetzt habe). Es wäre ziemlich cool, wenn jemand dieses Material nehmen und es für mehrere funktionale Sprachen "aufteilen" könnte. Könnte die Basis für ein ziemlich cooles Shootout in funktionaler Sprache sein!
Marc
1
Das Hauptproblem dabei ist, dass es Parsec einführt, ohne Monaden einzuführen.
Alternative
@alternative parsec hat eine Monadic-Schnittstelle, aber auch eine Applicative-Schnittstelle, ganz zu schweigen von zahlreichen anderen Funktionen. Es ist nicht so unvernünftig, Parsec vor der monadischen Verallgemeinerung einzuführen
Philip JF
4

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.

Alternative
quelle
3
"ziemlich genau überprüft, ob Ihr Code korrekt ist" ist sehr falsch. Das kann kein Typsystem. (Es sei denn, Ihr
Typensystem
4
@ Eli, hast du Haskell benutzt? Während diese Aussage theoretisch offensichtlich falsch ist, finde ich sie in der Praxis ziemlich genau, zumindest im Vergleich zu jeder anderen Sprache, die ich benutzt habe. Trotzdem bin ich nicht der Meinung, dass dies eine gute Unterkunft für Anfänger ist. Wenn ich die Seile lerne, würde ich lieber sehen, was mein Code falsch gemacht hat, als dass der Compiler mich anschreit, dass es falsch ist, und damit kämpfen muss, wenn ich nicht einmal weiß, welches Vokabular die Fehlermeldungen verwenden.
1
@ Eli "so ziemlich" ist hier der Schlüsselbegriff. In Haskell verbringen Sie mehr Zeit damit, darüber nachzudenken, wie es implementiert werden soll, dann ist die Implementierung recht einfach. Dann tippst du es, um sicherzugehen, dass deine Karten, Falze usw. gesund sind.
Alternative
@ Eli Barzilay: Haskells Typensystem scheint ganz nahe daran zu sein, ein Theorembeweiser zu sein. Es hat sicherlich eine Umgebung geschaffen, in der Theorembeweiser fast häufiger vorkommen als andere Werkzeuge. (Nicht, dass ich einen Kausalzusammenhang impliziere.)
greyfade
@luqui - Ja, ich habe es benutzt. Nein, es ist immer noch eine falsche Aussage, sowohl in der Praxis als auch in der Theorie. Das ist jedoch nichts Besonderes für Haskell.
Eli Barzilay
1

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.

autodidakto
quelle
0

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

Pyon
quelle
0

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.

Oktopusgrabbus
quelle
-2

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.

varreli
quelle