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
(defroutes app-routes
(GET "/" [] view/page)
(GET "/api" [] (wrap-aleph-handler api/socket-handler))
(route/resources "/static")
(route/not-found "page not found"))
Ein weiteres schönes Beispiel ist das Hiccup-Templating-Framework:
(html [:ul
(for [x (range 1 4)]
[:li x])])
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 eine a 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.