Was sind die Vorteile von LISP und Haskell? Werden sie mich zu einem besseren Programmierer machen? [geschlossen]

41

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?

Logan545
quelle
36
Die Verwendung von LISP und Haskell macht Sie zu einem besseren LISP- und Haskell-Programmierer, das garantiere ich.
Neil
17
@MasonWheeler muss ich sagen; In Haskells Schriftsystem gibt es eine Menge, die Sie in keiner anderen Sprache finden werden, und LISP-Makros sind in den gängigsten Sprachen nicht zu finden. Beide Dinge sind es wert , das Lernen , weil sie haben Sie einen besseren Programmierer in Ihrer Arbeitssprache machen. Zumindest war dies meine Erfahrung; Haskell hat mich zu einem besseren C # -Entwickler für Unternehmen gemacht. Ich kenne Techniken zur sauberen Umsetzung der Trennung von Anliegen, die ich sonst nie hätte, und das Parsen von Problemen wird für mich für immer viel einfacher sein, als bevor ich Haskell gelernt habe.
Jimmy Hoffa
6
Erlang ist eine funktionale Sprache. Rabbit MQ ist in Erlang und Rabbit's geschrieben und wird an vielen Orten verwendet, um viele missionskritische Aufgaben zu erledigen. In funktionalen Sprachen lernen Sie, anders über das Programmieren zu denken, und das ist ein schönes zusätzliches Werkzeug, das Sie zur Verfügung haben. Während es wahr ist, dass einige dieser Konzepte es in populärere Sprachen geschafft haben (z. B. Lambda-Ausdrücke in C # und C ++), nähern Sie sich der Problemlösung bei Verwendung einer funktionalen Sprache immer noch auf eine ganz andere Weise.
Binary Worrier
8
@MasonWheeler Es gibt durchaus gute Gründe, warum eine Sprache nützlicher sein kann als die anderen, aber immer noch nicht weit verbreitet ist. Ich kann an viele denken: Bestehende Anwenderbasis, zu radikale Veränderung, wenn "gut ist gut genug" und auch ... wenn das bessere Tool Programmierer erfordert, die formeller geschult sind. So Popularität ist kein gutes Maß für die Nützlichkeit .
Andres F.
5
@MasonWheeler Um eine Analogie zu verwenden, ist Mathematik ein äußerst nützliches Feld im wirklichen Leben. Warum beherrschen nicht mehr Leute die Mathematik? Warum haben viele Leute Angst davor und denken, es ist schwarze Magie und nicht wirklich nützlich?
Andres F.

Antworten:

37

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

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 mainWert 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 bTransformation 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.

Simon Bergot
quelle
1
@JimmyHoffa Ich denke, das verdient tatsächlich eine eigene Antwort, denn das ist es, was die Leute tendenziell übersehen. Es gibt Problembereiche, die am besten durch funktionale Programmierung gelöst werden können und von denen die Leute nicht einmal wissen, dass sie existieren, bis sie sich zumindest in Bereichen außerhalb ihrer Komfortzone versucht haben.
KChaloux
2
Ich weiß nichts über Assembly, und ich habe es auch nicht erwähnt. Mithilfe der Assembly können Sie jedoch besser verstehen, wie Ihre Programme ausgeführt werden. Es gibt großartige Beiträge zu SO von Personen, die in der Lage sind, ein Teil einer generierten Baugruppe zu analysieren, um ein Leistungsproblem zu erklären.
Simon Bergot
3
@KChaloux Ich würde die Antwort schreiben, aber diese Frage sollte geschlossen werden (ich stimme dementsprechend ab). Einfach ausgedrückt könnte ich meine Meinung und Erfahrung in eine Antwort schreiben, aber es wäre nicht mehr richtig oder falsch als die anderen Antworten. Das Problem sind Fragen zur Sprachempfehlung und warum ich für den Abschluss gestimmt habe.
Jimmy Hoffa
7
OMG, @Neil zu wissen, was der Computer am sichersten macht , macht Sie zu einem besseren Programmierer. Ich habe seit Jahren keine Assembly mehr geschrieben, sondern lese sie regelmäßig (über eine Reihe von Plattformen hinweg). Wenn Sie daran interessiert sind, wie Ihr Programm tatsächlich funktioniert, ist es wichtig, mindestens die Grundlagen zu kennen.
Dash-Tom-Bang
3
@Neil, in welchem ​​Fall ist es ein Vorteil, ein schlechterer Programmierer zu sein? Was bringt Sie dazu, Spaghetti-Code aufzurufen? Was hat Spaghetti-Code mit Assembly zu tun oder damit, ein guter Programmierer zu sein, außer in dem Fantasy-Land, das Assembly nicht kennt und eine Rationalisierung benötigt, um es nicht zu lernen? Wenn man ein guter Assembly-Codierer ist, ist man sich der schlechten Codierungspraktiken sehr bewusst .
Dash-Tom-Bang
12

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:

  1. Homoikonischer Code. Dies ermöglicht strukturierten selbstmodifizierenden Code.
  2. Syntaxbewusste Makros. Sie ermöglichen das Umschreiben des Kesselschildcodes.
  3. Pragmatismus. CL wurde entwickelt, um Dinge von Fachleuten erledigen zu lassen. Die meisten funktionalen Sprachen sind in der Regel nicht.
  4. Flexibilität. Es kann viele verschiedene Dinge tun, und das alles mit angemessener Geschwindigkeit.
  5. Wartiness. Die reale Welt ist chaotisch. Pragmatische Codierung muss entweder chaotische Konstrukte verwenden oder erfinden. Gemeines Lisp hat genügend Warzen, um Dinge zu erledigen.

Die einzigen wirklichen Gründe, sich gegen CL zu entscheiden, sind wahrscheinlich die veralteten Standardbibliotheken.

Ich werde mich auf die Probe stellen und sagen, dass die Syntax im Allgemeinen für einen professionellen Software-Entwickler kein Problem sein sollte.

Von: Warum ist Lisp nützlich?

Haskell:

Haskell ist eine Computerprogrammiersprache. Insbesondere ist es eine polymorph statisch typisierte, faule, rein funktionale Sprache, die sich von den meisten anderen Programmiersprachen deutlich unterscheidet. Die Sprache ist nach Haskell Brooks Curry benannt, dessen Arbeit in mathematischer Logik als Grundlage für funktionale Sprachen dient. Haskell basiert auf dem Lambda-Kalkül, daher das Lambda, das wir als Logo verwenden.

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.

Ich denke, je globaler Ihr Denken ist, desto besser sind Sie Entwickler.

Zum Beispiel können Sie Ihrem Code nützliche Kommentare hinzufügen, sich um die Lesbarkeit Ihres Codes und die Wartbarkeit kümmern. Achten Sie auf die kleinen Details. Überlegen Sie, bevor Sie tippen !. Erfahren Sie mehr über Entwurfsmuster. Befolgen Sie die bewährten Methoden.

Disclosure: Dies ist schamlose Werbung der schlimmsten Art, da sie aus meinem Blog stammt.

jsedano
quelle
4
Haben Sie LISP oder Haskell auf einem kompetenten Niveau gelernt?
Jimmy Hoffa
10
Es ist etwas unaufrichtig, das von jemandem zu hören, der so gut wie nichts von beiden Sprachen versteht. Sie behaupten, dass sie keine Werkzeuge sind, die Sie gerade benötigen, aber Sie wissen nicht, wofür sie geeignet sind. Wie können Sie das wissen? Wie können Sie jemandem raten, was er von ihm lernen wird oder nicht, sofern Sie wissen, dass LISP ein SQL-Derivat ist, das nur für die Analyse relationaler Daten nützlich ist, und Haskell möglicherweise eine strenge Untergruppe von Regexp darstellt.
Jimmy Hoffa
10
Dies beantwortet die Frage nicht wirklich. Sie haben die beeindruckende Leistung vollbracht, eine vage allgemeine Antwort auf eine Frage zu zwei Sprachen zu geben, die Sie nicht kennen: /
Andres F.
2
-1 weil dies vage um das tanzt, was Common Lisp und Haskell dir genau beibringen. Beispiele: Code als Daten Daten als Code, Reinheit, referenzielle Transparenz, monadische Abstraktionen, funktionale Programmierung, sprachorientierte Programmierung,
typgesteuerte
3
Darüber hinaus keine Sprache zu kennen, glaube ich nicht, dass Sie diese Frage beantworten können: / Sorry
jozefg
9

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.

Jetti
quelle