32 Stimmen

Ist Haskell ein Lisp?

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?

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

43voto

Rainer Joswig Punkte 131198

Lisp ist ein sehr vages Konzept. Ich sehe zwei mehr oder weniger sinnvolle Interpretationen:

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

  2. 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:

  1. eine Sprache, die funktionale Programmierung unterstützt: Lisp, APL, ..., ML, SML, OCAML, F#, Miranda, Haskell, ...

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

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

20voto

WReach Punkte 17728

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)

9voto

mnuzzo Punkte 3381

Dem würde ich nicht zustimmen. Es sind beides funktionale Programmiersprachen und Lisp hat Haskell beeinflusst, aber Haskell ist kein Lisp-Derivat. Schauen Sie sich nur die Menge der Klammern an und Sie können es erkennen.

4voto

Yan King Yin Punkte 1053

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.

4voto

adrusi Punkte 825

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X