2010-07-04 12 views
31

Mögliche Duplizieren:
Haskell vs. procedural programming in the real worldWarum sollte ich Haskell lernen wollen?

Einige Male hörte ich die Leute sagen Dinge wie „Jeder Programmierer sollte Haskell wissen“, „Du bist kein Programmierer, wenn Sie nicht wissen, Haskell " und so weiter. Allerdings bin ich nicht genau sicher, ob ich mich bemühen sollte, ein kurzes Verständnis dieser Sprache zu bekommen oder nicht. Herumspielen mit Dolmetscher (um intuitives Verständnis der Grundlagen zu bekommen) dauert mindestens ein paar Tage (wenn nicht Wochen), und ich bin mir nicht sicher, ob das Ergebnis es wert sein wird.

Ein bisschen Hintergrund (um zu bekommen Idee meines Wissens)
Ich habe angefangen, als Kind (irgendwo zwischen 10 oder 13 Jahren) mit programmierbaren Rechner zu programmieren, wechselte zu Basic, dann auf Nicht-x86-Assembly (Multiplikation und Division zu erweitern, und selbstmodifizierende Maus schreiben Der Treiber hat Spaß gemacht, Pascal, Delphi, jetzt benutze ich fast ausschließlich C++. Ich kenne mich mit Unix-Shell aus, kann Software in Python schreiben und wahrscheinlich in irgendetwas (wenn ich ein Referenzbuch habe), das entfernt C++ oder Pascal ähnelt (dh Blöcke, ähnliche Flusskontrolle, usw.) Spezialisierung ist 3D-Programmierung und Shader. "Fisch im Wasser" mit Low-Level-Operationen (Cs Speicherzuweisung, Zeiger), weniger komfortabel mit extremem OOP-Ansatz (d. h. wenn Klassen gemacht werden, um Klassen zu haben. Fast vollständig autodidaktisch. I.e. Definitiv kein Neuling, aber es gibt Bereiche, in denen ich mich verbessern könnte.

Also ... was könnte ich möglicherweise von dem Studium von Haskell an diesem Punkt gewinnen? Soweit ich weiß, ist diese Sprache nicht wirklich weit verbreitet, daher gibt es wahrscheinlich weniger Bibliotheken, mit denen sie interagieren kann (wie bei der Delphi-Programmierung - Sie können DirectX-Programmierung in Delphi machen, wenn Sie wirklich wollen, aber Sie können schreib kein 3dsmax/maya-plugin (na ja, theoretisch ist es möglich, aber sicher nicht einfach)). Ich denke auch nicht, dass ich in der Lage sein werde, ein Stück Haskell Code in die Game Engine zu stecken.

Also, welche Art von nützlichem Wissen kann ich daraus bekommen?

P.S. Ich werde nicht kaufen "Wenn Sie eine andere Sprache lernen, werden Sie wahrscheinlich etwas lernen, das wahrscheinlich nützlich sein wird" Argument.

+0

Mögliche Duplikate? http://stackoverflow.com/questions/1604790/what-is-haskell-actually-useful-for –

+2

@Sergio Tapio: Ich glaube nicht. Ihre Frage lautet: "Wo kann ich Haskell verwenden?" Ich fragte: "Was für nützliche Kenntnisse ich daraus bekomme". Es ist mir egal ob Sprache populär oder nicht, aber wenn es irgendeine Art von Konzept lehrt, kann ich (möglicherweise) in einer anderen Sprache erneut anwenden, es kann meine Zeit wert sein. – SigTerm

+3

Noch ein dup: http://StackOverflow.com/Questions/1024585/Haskell-VS-procedural-Programming-in-the-Real-world – Konerak

Antwort

72

(Sicherlich ist dies eine doppelte Frage, aber ich kann man jetzt nicht finden.)

Sie lernen es um rein funktionale Programmierung zu erlernen, die Sie zwingt viele Dinge in einem ganz anderen Art und Weise zu tun. Du erhältst eine neue Art zu denken. Programmierung ohne Zustand? Programmieren ohne Effekte? Alles ist faul? Verrücktes System mit Typinferenz? Was zur Hölle sind Monaden? Dein Verstand wird immer wieder in die Luft gejagt, aber am Ende kommst du mit neuen Perspektiven/Techniken aus der funktionalen Programmierung heraus, die sonst nur schwer zu erreichen sind, ohne dass du Haskell vollstopfen musst.

Das Problem mit dem Versuch, spezifisch zu sein, ist der Versuch, einem Nicht-Haskeller zu erklären, was er von Haskell lernen wird, als würde man einem blinden Mann die Farbe "grün" erklären.

+14

BTW, reagierend auf "verrücktes System" - Ich finde Haskells Typ System, um die natürlichste Sache vorstellbar zu sein, und es lässt mich fragen, warum andere Sprachen nicht solche sinnvollen Systeme haben. :-) – ShreevatsaR

+0

@Shreevatsa, Wenn dein "Wundern" nicht rhetorisch ist, dann: "andere" Sprachen haben solche Typsysteme nicht, weil sie sich auf die während der Ausführung ausgeführten Operationen (sogar OO-Langs) beziehen, nicht auf die Schönheit der Notation oder Beziehungen zwischen Konzepten, die das Programm bilden. –

+10

@Carl Smotricz: * "Es ist wie Haskells Typsystem mit Java als Skriptsprache." * ... das ist vielleicht das Erschreckendste, was ich jemals gehört habe. :) –

2

Das Erlernen einer funktionalen Sprache wird sich von dem, was Sie gewohnt sind, ziemlich unterscheiden. Also ja, werden Sie wahrscheinlich zu etwas Nützliches lernen;)

+1

Dies ist leider genau die Art von Antwort OP will nicht :) –

15

Ich glaube nicht, dass ich einfach in der Lage sein, ein Stück von Haskell-Code in Game-Engine zu stopfen.

Wenn Sie nur 3D-Spiele-Engines schreiben wollen, dann hat es vielleicht nicht viel Sinn, Haskell zu lernen.

Wenn Sie ein gut gerundeter Programmierer sein wollen, der in der Lage ist, in mehreren Paradigmen zu programmieren, und Sie derzeit nur C-ähnliche Sprachen kennen, dann ist es einen Blick wert.

Jedes Mal, wenn Sie eine neue, sehr unterschiedliche Sprache lernen, wird das Lernen der nächsten Sprache einfacher, weil Sie nicht nur neue Syntax auswendig lernen, sondern auch andere Denkweisen über Programmierung lernen. Wenn Sie eine neue Sprache ausprobieren und ein neues Feature sehen, werden Sie es schneller verstehen, wenn Sie es mit einem anderen Feature in einer Sprache in Verbindung bringen können, die Sie bereits kennen. Je mehr Sprachen Sie kennen, desto wahrscheinlicher ist es, dass dieses neue Feature dem ähnelt, was Sie zuvor gesehen haben.

Es ist auch praktisch, viele Werkzeuge zur Verfügung in Ihrer Toolbox zu haben. Manche Probleme werden besser in einer Sprache gelöst als in einer anderen. Wenn Sie 5 verschiedene Arten von Sprachen haben, können Sie für jedes Problem die beste auswählen. Wenn Sie nur zwei oder drei sehr ähnliche Sprachen kennen, werden einige Probleme leicht zu lösen sein, aber andere sind vielleicht schwieriger, als wenn Sie eine Sprache verwenden würden, die für diese spezielle Aufgabe besser ist.

1

Funktionale Sprachen wie Haskell sind eine andere Art und Weise über ein Problem nachzudenken. Sie sind nützlich zum Lernen und Lehren von Datenstrukturen und Algorithmen, da sie diese Art von Problem vereinfachen.

Wenn Sie die STL von C++ verwenden, die über funktionale Konzepte verfügt, die denen von Haskell und anderen Sprachen ähneln, hilft Ihnen die Haskell-Grundierung zu verstehen, wie die STL funktioniert.

Wenn Sie XSL verwenden: T XML zu verwandeln, das ist sehr funktional im Design.

+1

Ich vermute, Sie haben "funktional" mit "deklarativ" verwechselt.XSLT hat keine Funktionen erster Ordnung, oder? –

4

Es gibt mehrere Dinge, die Sie bekommen können, hauptsächlich in der Art, wie Sie über Dinge denken. Zum Beispiel ist es interessant zu bemerken, was eine minimale Sprache ist. Wenn Sie SICP durchlaufen (und die gleichen Konzepte gelten auch für Haskell), werden Sie feststellen, dass Sie überhaupt keine Schleifensyntax benötigen. Sie benötigen keine vordefinierten Funktionen, die bei größeren Strukturen funktionieren. Sie können so ziemlich alles definieren, was Sie brauchen, wenn Sie einen Constructor/Dekonstruktor oder eine Möglichkeit, einen zu definieren, und die Fähigkeit, Funktionen zu rekrutieren, erhalten. Sie können alles andere selbst definieren - und es ist eine interessante Übung, dies zu tun. Und das ist nur die Spitze des Eisbergs.

Auf einer praktischen Ebene, zum Beispiel, vor ein paar Wochen habe ich OCaml Hausaufgaben und Stöhnen "Warum hat diese $% $% # Sprache call/cc nicht!?!" Ich war in Gedanken versunken, als ich merkte, was ich dachte - ich hätte es nie verpasst, wenn ich nicht wüsste, was es war, und ich würde nicht wissen, was es war, wenn ich mir Scheme, Haskell nicht ansehen würde. Rubin.

Sie können viele schöne Beispiele bei ICFP Wettbewerb finden; Die eine, die mich wirklich begeistert hat, war this entry bei this contest. Sie haben in Haskell eine neue Sprache geschaffen, um ihr Problem zu lösen. Vor

+0

+1 für das Sprachfeature, nach dem Sie sich sehnen, aber nicht haben können. Ignoranz ist eine Glückseligkeit, also lerne nur eine Programmiersprache und vergiss alle anderen. Sie werden Ihren Geist mit Ideen der Sünde beschmutzen, aber nicht benutzen können! –

40

einigen Jahren beschlossen, ein hübsches Mädchen in unserer Abteilung Informatik Teilzeit zu studieren. Viele Leute waren überrascht, dass einer der Einführungskurse mit Haskell als Programmiersprache gelehrt wurde! Obwohl ich keine Erfahrung mit Haskell hatte, hatte ich etwas Hintergrundwissen in Lisp und anderen funktionalen Programmiersprachen und konnte ihr mit ihren Übungen helfen.

Nein, es gibt kein Happy End dieser Geschichte: Sie fiel aus, verheiratet jemand anders, und ich habe sie nicht in eine lange Zeit gesehen. Aber ich denke, die Anekdote zeigt, wie Wissen nützlich sein kann, wenn man es am wenigsten erwartet.


In praktischer Hinsicht: Sie haben vielleicht bemerkt, dass die CPU-Geschwindigkeiten eine Wand vor einigen Jahren getroffen, und jetzt dem praktischste Weg, um mehr Leistung zu ziehen von Computern ist von mehreren CPUs installieren. Nun ist es so, dass die meisten, wenn nicht alle Programmiersprachen, die Sie kennen, im Wesentlichen single-tasking sind und der Von Neumann bottleneck unterliegen. Eine naheliegende Lösung ist die parallele Programmierung, aber das kann sehr schmerzhaft sein, wenn die parallelen Teile Ihres Programms den Zustand teilen, d. H. Speicher - und dies ist meistens der Fall.

Es stellt sich heraus, dass das funktionale Programmieren ein Stil ist, mit dem Sie die Probleme der parallelen Programmierung mit gemeinsamem Status meist umgehen können. Anders ausgedrückt ist es ziemlich einfach, Programme im FP-Stil zu schreiben, die "natürlich" threadsicher und für die parallele Verarbeitung geeignet sind. Abhängig von der Sprache, dem Compiler und der Hardware können Sie sogar (wie ich kürzlich) Teile Ihres Programms parallel ausführen, ohne jemals eine explizite Codierung für Parallelität vorgenommen zu haben.

Ich liege oft falsch, aber ich denke, dass Functional Programming eines der heißesten Programmierparadigmen der Zukunft werden wird, da die parallele Programmierung wichtiger und schwieriger wird. Haskell mag nicht die Sprache der Wahl sein - mein persönlicher Favorit ist derzeit Clojure - aber es kann sich lohnen, einen Blick auf eine oder mehrere FP-Sprachen zu werfen.

2

Ich würde sagen, wenn es eine lästige Pflicht ist, tun Sie es nicht. Sonst beginne zu lesen this und Sie sollten nach 10 Minuten sehen, wenn Sie gelangweilt sind oder wenn Sie gegriffen sind und nicht aufhören können, es zu lesen.

Verwandte Themen