Ich habe The Haskell Road to Logic, Maths and Programming von Doets und Eijck 2004 gelesen. Es scheint ein gut angesehenes Buch zu sein, aber ich war erstaunt, als es behauptete, dass Haskell ein Mitglied der Lisp-Familie ist. Ist das richtig? Ich würde Lisp mit s-Ausdrücken, unreinen Funktionen und Listen als einzige zusammengesetzte Datenstruktur charakterisieren. Haskell hat nichts von alledem. Wie lässt sich diese Behauptung rechtfertigen?
Antworten
Zu viele Anzeigen?Lisp ist ein sehr vages Konzept. Ich sehe zwei mehr oder weniger sinnvolle Interpretationen:
-
Lisp als eine Familie von Sprachen, die einige gemeinsame Ideen haben. In einer weiten Auslegung gehören sehr unterschiedliche Sprachen zu dieser Familie: Common Lisp, Scheme, Logo, Dylan, Emacs Lisp, Clojure, RLisp, 3Lisp und viele, viele andere.
-
Lisp als eine Reihe von Sprachen, die irgendwie eine Kernsprache implementieren (CAR, CDR, CONS, LAMBDA, PROG, SET, SETQ, QUOTE, DEFUN, IF, COND, DO, ...): Lisp 1.5, MacLisp, Lisp Machine Lisp, Emacs Lisp, Common Lisp, ISLisp. Beachten Sie, dass diese Sprachen normalerweise "Lisp" als Teil ihres Namens haben.
Einige typische Dinge, die wir in Lisp-Dialekten finden: Strikte Auswertung, Seiteneffekte, direkte imperative Programmierung, funktionale Programmierkonstrukte, s-Ausdrücke, Auswertung, Makros.
Haskell ist eine ganz andere Sprache: nicht-strikte Auswertung, Syntax nicht auf s-Ausdrücken basierend, statische Typisierung, rein funktional.
Haskell passt weder zu 1 noch zu 2. Ich würde also sagen, Haskell ist kein Lisp.
Ähnlich können wir sagen, dass eine funktionale Programmiersprache ist:
-
eine Sprache, die funktionale Programmierung unterstützt: Lisp, APL, ..., ML, SML, OCAML, F#, Miranda, Haskell, ...
-
eine Sprache, die die funktionale Programmierung erzwingt. Hier passt Lisp schon nicht wirklich hinein, denn imperative oder gar objektorientierte Programmierung ist in Lisp nicht zweitrangig.
-
eine Sprache, die die reine funktionale Programmierung erzwingt. Hier haben wir Haskell als gutes Beispiel. Als relativ neuer Lisp-Dialekt könnte auch Clojure dazu passen.
Normalerweise unterstützt Lisp die Funktionale Programmierung nur, erzwingt sie aber nicht. Es ist also eine funktionale Programmiersprache in einer weiteren Interpretation.
Haskell ist eine der Sprachen, die als rein funktionale Programmiersprache angesehen wird.
Ich denke, es ist etwas weit hergeholt, Haskell als Mitglied der LISP-Familie zu betrachten, aber ich vermute, die Argumentation geht in etwa so...
Bei der Klassifizierung von Programmiersprachen ist es sinnvoll, sie in zwei Gruppen zu unterteilen: diejenigen, die von FORTRAN abstammen, und diejenigen, die es nicht sind. Im Jahr 1958 gehörte zur "Nicht-FORTRAN-Gruppe" vor allem LISP (zumindest unter den Sprachen, die heute noch nicht ausgestorben sind). Eine Zeit lang hatte der Stammbaum der Programmiersprachen also zwei Hauptzweige: die FORTRAN-Nachkommen und die LISP-Nachkommen. Wenn das die einzigen beiden Möglichkeiten sind, dann würde ich Haskell dem LISP-Zweig zuordnen.
Viele Kommentatoren sind jedoch der Ansicht, dass Sprachen wie ML, Prolog und APL "aus heiterem Himmel" entstanden sind und ausreichend unterschiedliche Paradigmen eingeführt haben, um eine eigene Linie zu verdienen. Haskell ist eindeutig mit ML verwandt.
Beispiele für solche Klassifizierungen sind die folgenden Stammbäume von Programmiersprachen:
O'Reilly's Programmiersprachen-Poster
Zeitleiste der Computersprachen auf levenez.com
HOPL: ein interaktives Verzeichnis der Programmiersprachen (Haskell-Eintrag)
Ich denke, Haskell est ein Lisp in dem Sinne, dass sie beide auf dem Kalkül beruhen. Haskell ist eine Implementierung von .
Obwohl die meisten Leute sagen würden, dass Haskell zur ML-Familie gehört. ML basiert auch auf , wie alle funktionalen Sprachen, die ich kenne.
Unter der Haube ist OCam (das von ML abstammt) zu kombinatorischer Logik kompiliert, einem Formalismus, der dem Kalkül entspricht und von Haskell Curry erfunden wurde, dem Logiker, nach dem Haskell benannt ist. Aber die Verwendung von kombinatorischer Logik für die Kompilierung funktionaler Sprachen scheint heutzutage weniger populär zu sein, daher bin ich mir bei modernen Compilern wie GHC nicht sicher.
Die Syntax von Lisp ist fast identisch mit dem Kalkül, was diese Familie (Scheme, Clojure usw.) zu etwas ganz Besonderem macht.
Was als Lispeln definiert wird, ist unterschiedlich. Die ursprüngliche Spezifikation für ein Lisp erwähnte überhaupt keine Makros und definierte nur eine kleine Liste von primitiven Funktionen, die, wenn ich mich recht erinnere, die folgenden sind:
cons
car
cdr
cond
eq
atom
and
or
not
nil
Dies ist vielleicht nicht die vollständige Liste, oder sie könnte einige zusätzliche Mitglieder enthalten, aber auf jeden Fall, Die ursprüngliche Spezifikation von John McCarthy war sehr klein.
Wenn man eine Lisp-Sprache als eine Sprache definiert, die alle diese Funktionen definiert, dann sind die meisten modernen Sprachen Lisp-Sprachen, einschließlich Haskell.
Eine strengere und modernere Definition eines Lisp lautet wie folgt:
- eifrige Auswertung
- dynamische Schreibweise
- unrein funktionell
- Makros
- Konzentration auf Listen als primäre Datenstruktur
Haskell erfüllt die ersten drei Punkte nicht, seine Makros (Template-Haskell) folgen nicht dem Code-ist-Daten-Paradigma, und obwohl Listen sehr wichtig sind, sind sie nicht die primäre Datenstruktur.
Ich würde also sagen, nein, Haskell ist kein Lisp.
- See previous answers
- Weitere Antworten anzeigen
1 Stimmen
Ich bin anderer Meinung, aber was war das Argument der Autoren?
2 Stimmen
Keine! Sie geben eine allgemeine Einführung und sagen "als funktionale Sprache ist Haskell Teil der Lisp-Familie zusammen mit ML, Occam und Clean".
3 Stimmen
Das ist ein Irrtum. Lisp mag die erste funktionale Sprache gewesen sein, aber das macht nicht alle funktionalen Sprachen zu Lisp, so wie Java nicht Smalltalk und Python nicht C ist. Und um Ihre Liste der Lisp-Merkmale, die Haskell fehlen, zu ergänzen: Lisp hat nur wenige der Haskell-Merkmale, die über das Einsteigerniveau hinausgehen (für den Anfang: Monaden, algebraische Datentypen und Mustervergleich).
9 Stimmen
Listen sind pas die einzige zusammengesetzte Datenstruktur in Lisp. Sie werden nur zufällig für den Syntaxbaum verwendet.
2 Stimmen
Ist dies nicht genau eine Frage vom Typ "Ich bin neugierig, ob andere Leute so fühlen wie ich"? Laut den FAQ sind solche Fragen zu "vermeiden".
0 Stimmen
Abstimmung über den Abschluss und die Verlegung nach Programmierer.
1 Stimmen
@delnan: "Lisp" ist eigentlich eine Familie von Sprachen, und einige von ihnen haben sehr fortgeschrittene Funktionen (siehe Qi und Shen).
1 Stimmen
@TikhonJelvis: Ich habe tatsächlich von Qi gehört. Das Wenige, was ich von dem Typsystem gesehen habe, ist sicherlich beeindruckend. Ich bin mir allerdings nicht sicher, ob viele es zu Lisp zählen würden (ja, es ist in Lisp implementiert und von Lisp beeinflusst, aber Java ist auch nicht C++) - es scheint stark von den meisten (allen?) existierenden Lisp-Dialekten abzuweichen und fügt wichtige Konzepte hinzu, wobei die verbleibende Ähnlichkeit einige gemeinsame Grundlagen wie Listen, eine vage Verbindung zum Lambda-Kalkül und S-Ausdrücke/Homoikonizität sind. (Tatsächlich habe ich auf Wikipedia und der Qi-Website keine Behauptung gefunden, dass Qi ein Lisp ist).
1 Stimmen
@delnan: Zumindest baut Qi auf Common List auf und "erbt alle Eigenschaften von Lisp, die ML und Haskell nicht haben". Sie können auch Common Lisp und Qi Funktionen in einer Datei mischen. Ich denke, das macht Qi zu einem Teil der Lisp-Familie. (Das Zitat ist von Qi's Google Code Seite .)
0 Stimmen
1.) Pattern Matching wurde zuerst in Lisps implementiert, es gibt eine Übung in SCIP, um es zu implementieren. Was verwirrend ist, ist, dass Lispers dann die Mustererkennung ignorierten und alles mit cadr und caddadaaadr machten... Monaden sind typsichere Wege der Programmierung in Makros, die let, apply und do(progn) sowie setf && andere außer Kraft setzen/erweitern. Ich glaube, in Lisp wurden sie "Kontexte" genannt. ADTs sind typsichere s-Ausdrücke.