Ich weiß, dass Lisp und Haskell logische bzw. funktionale Programmiersprachen sind, aber was genau bedeutet das? Wie unterscheiden sie sich von anderen Sprachen? Ich habe gehört, dass Sie durch das Lernen ein besserer Programmierer werden und Ihre Logik verbessern können. Ist das wahr und wenn ich Lisp oder Haskell auf ein kompetentes Niveau lerne, wird sich meine Programmierung verbessern und ich werde besser in der Lage sein, Probleme in jeder Sprache zu lösen? Ich wollte nur wissen, ob sie den Lernaufwand wert sind. Sind diese Sprachen auch in Bereichen wie GUI und Grafik nützlich oder nur für Konsolenanwendungen?
41
Antworten:
Es ist sehr ähnlich, als würde das Erlernen von Mathematik Ihre analytischen Fähigkeiten verbessern und das Erlernen von lateinischer / klassischer Literatur Ihre Schreibfähigkeiten verbessern.
Leute, die diese Sprachen entworfen haben, haben sich Gedanken darüber gemacht, was es heißt, ein Programm zu schreiben. Und diese Sprachen sind die Ergebnisse dieser Forschungen.
Das Erlernen von Java macht Sie jedoch auch zu einem besseren Programmierer. Und C lernen. Der wahre Nutzen liegt darin, Sprachen mit einer anderen Philosophie zu lernen. Dann können Sie sich selbst ein Bild davon machen, wie ein Programm geschrieben werden soll.
Bearbeiten
Mir ist klar, dass diese Antwort für Leute, die noch kein Haschisch und / oder Lispeln gelernt haben, nicht so nützlich ist. Hier einige Beispiele, um weiter zu erläutern, was ich meine
LISPELN
Lisp glaubt, dass die Syntax minimal sein sollte und dass alles entweder eine Liste oder ein Primitiv sein sollte (Lisp steht für List Processing). Sogar Programme sind hauptsächlich Listen mit anderen Listen und Symbolen. Mit Lisp können Sie Programme als Liste bearbeiten und neue Programme im laufenden Betrieb generieren. Daher das ganze
code is data and data is code
Motto.Die direkte Konsequenz ist, dass Sie mit den Lisp-Sprachen jede gewünschte Schnittstelle definieren können. Ein schönes Beispiel ist Compojure, ein Clojure-Webframework. So sieht eine Routing-Funktion aus
Ein weiteres schönes Beispiel ist das Hiccup-Templating-Framework:
Wie Sie sehen können, ist das Ergebnis so knapp wie bei DSL wie bei Schnurrbart, aber Sie können die Sprachfunktionen wie verwenden
(for [x (range 1 4)] block)
. Noch schöner ist, dass Sie alle Werkzeuge haben, um Ihren Code zu abstrahieren und zu strukturieren.In anderen Sprachen ist die Syntax komplexer. Sie können ein Java-Programm nicht als eine Reihe von Listen lesen. Durch die Verwendung von Lisp erhalten Sie jedoch eine bessere Vorstellung davon, wie eine ideale Benutzeroberfläche aussehen sollte und was in Ihrem Code als Daten abstrahiert werden kann. Es hilft Ihnen auch, Ihre Lieblingssprache als Big-Data-Struktur zu sehen und ihre Semantik besser zu verstehen.
Haskell
Haskell glaubt an starke statische Typisierung und Reinheit. Reine Funktionen sind wie mathematische Funktionen: Sie werden auf einer Menge von Werten definiert und auf einer anderen Menge abgebildet. Die Funktion hat keine Nebenwirkungen und die Werte sind unveränderlich. Reinheit ist interessant, weil es nichts ist, was eine Multi-Paradigmensprache haben kann. Eine Sprache ist entweder rein oder nicht.
Eine Konsequenz ist, dass Sie keine E / A-Aktionen ausführen können, wann immer Sie möchten (nach Ansicht von haskellers ist dies eine gute Sache). IO-Aktionen werden als Transaktionen definiert, die selbst reine Werte sind. Der
main
Wert eines Hash-Programms ist eine E / A-Transaktion, die ausgeführt wird, wenn Sie das Programm ausführen.Sie müssen sich explizit mit dem Datenfluss in Ihrem Programm auseinandersetzen. Sie können keine Kommunikation zwischen zwei Komponenten herstellen, indem Sie Daten in einer globalen Variablen schreiben und lesen. Sie müssen Werte erstellen und übergeben.
Ein weiteres von Jimmy Hoffa erwähntes Merkmal ist das Rich-Type-System. Während andere Sprachen statische Typisierung haben, können Sie in haskell Dinge haben wie:
length :: [a] -> Int
(Funktion von einer Liste von a's zu einem int)map :: (a -> b) -> [a] -> [b]
(Funktion, die einea to b
Transformation und eine Liste von a annimmt und eine Liste von b zurückgibt)Das Schöne ist, dass ich nicht erklären muss, was diese Funktionen tatsächlich tun: Sie verstehen ihr Verhalten bereits. Außerdem können Funktionen mit diesen Signaturen nur die Länge einer Liste berechnen und eine Transformation über eine Liste abbilden.
In anderen typisierten Sprachen machen Klassenhierarchien in Kombination mit der Veränderlichkeit den Umgang mit diesen Typen zu einem Albtraum. Man muss Dinge wie Kovarianz und Kontravarianz verstehen, die aus sprachlicher Sicht unmöglich zu erreichen sind (dh einfach, mächtig und sicher).
Entweder nehmen Sie den sicheren Weg (wie Scala) und landen in einer wirklich komplexen Sprache, oder Sie wählen den einfachen Weg und erhalten etwas, das entweder begrenzt ist (google go generics beschränkt auf Liste und Karten) oder unsicher ist (Dart-Generika, die es immer gibt Kovariante).
Wenn Sie haskell verwenden, lernen Sie hauptsächlich die Vorteile der Reinheit und das Schreiben von reinem Code kennen.
quelle
Das Erlernen neuer Funktionen kann Sie nur zu einem besseren Programmierer machen, aber es geht nicht darum, in welchen Sprachen Sie Code schreiben können , wenn Sie ein besserer Programmierer sind .
Was sind die Vorteile von LISP und Haskell?
LISPELN:
Von: Warum ist Lisp nützlich?
Haskell:
Sie können dort eine Beschreibung von Functional vs imperative lesen
Von: http://www.haskell.org/haskellwiki/Introduction
Werden sie mich zu einem besseren Programmierer machen?
Ja, natürlich kann das Wissen um mehr Sprachen und Paradigmen Sie nur zu einem besseren Programmierer machen.
Es gibt kein einziges Tool, kein einziges Buch, kein einziges Programmierparadigma, das Sie zu einem besseren Programmierer macht.
Das Erlernen verschiedener Programmiersprachen mit unterschiedlichen Paradigmen hilft Ihnen auf jeden Fall dabei, ein besserer Programmierer zu sein. Das Erlernen, Probleme mit unterschiedlichen Ansätzen zu lösen, wirkt sich auch positiv auf Ihr logisches Denken aus.
Ein guter Programmierer zu sein, bedeutet nicht viel über die Sprache, sondern über die Fähigkeit, jedes Problem in jeder Sprache zu lösen. Und wenn Sie die Sprache nicht kennen, die Fähigkeit, diese Sprache schnell zu lernen und effektiv zu verwenden.
Disclosure: Dies ist schamlose Werbung der schlimmsten Art, da sie aus meinem Blog stammt.
quelle
Wenn Sie Sprachen erlernen, die nicht dem von Ihnen üblichen Paradigma entsprechen, können Sie täglich alternative Lösungen finden und einige Funktionen in der Sprache Ihrer Wahl besser verstehen. Nur diese Sprachen zu kennen, macht Sie nicht zu einem besseren Programmierer, es sei denn, Sie können die Lektionen, die Sie aus diesen Sprachen gelernt haben, auf Situationen anwenden, die Sie jeden Tag sehen.
Davon abgesehen ist es nicht auf Sprachen beschränkt. Wenn Sie sich über verschiedene Datenstrukturen informieren, die Sie zuvor noch nicht gesehen oder verwendet haben, kann dies dazu beitragen, Ihren Wissensumfang zu erweitern, sodass Sie beim nächsten Auftreten eines Problems eine weitere mögliche Lösung finden.
quelle