WikiDer > Haskell (Programmiersprache)

Haskell (programmeertaal)
Haskell
Haskell
Paradigmarein funktional
erschien1990
Entwickelt vonSimon Peyton Jones, Paul Hudak, Philip Wadler und andere
Aktuelle VersionHaskell 2010 (Juli 2010)
Typensystemstatisch, stark, gefolgert
ImplementierungenGHC, Umarmungen und andere
DialekteHelium, Mädchen für alles
Beeinflusst vonlispeln, APL, hoffen, Miranda, ML, ICH WÜRDE
Einfluss aufC#, Curry, F#, LINQ, Perle 6, Python, Reichweite
BetriebssystemMultiplattform
Dateierweiterungen.hs, .lhs
Webseitehttps://haskell.org/
Portal  Portalsymbol  Informatik

Haskell ist ein funktionale Programmiersprache benannt nach dem MathematikerHaskell Brooks Curry.

Geschichte

Haskell wird hauptsächlich an der Universität Glasgow.

Loslegen

Mit dem Erscheinen der Programmiersprache Miranda im Jahr 1985 (herausgegeben von Research Software Ltd.) faulfunktionale Sprachen. Bis 1987 waren bereits viele funktionale Sprachen im Einsatz. Miranda war die am weitesten verbreitete Sprache, war aber proprietäre Software. Auf der Internationalen Konferenz für Funktionale Sprachen 1987 in Portland Es bestand Einigkeit darüber, dass a offener Standard sollten für solche Sprachen erstellt werden. Ziel des Ausschusses war es, bestehende Funktionalitäten in einer gemeinsamen Sprache zu konsolidieren, um als Grundlage für die weitere Erforschung funktionaler Sprachen zu dienen.[1]

Haskell 1.0 bis 1.4

Die erste Version von Haskell, Haskell 1.0, wurde 1990 erstellt. Die Arbeit des Ausschusses führte zu einer Reihe von Sprachdefinitionen (1.0, 1.1, 1.2, 1.3 und 1.4).[2]

Haskell 98

Ende 1997 führte die Reihe von Definitionen zu Haskell 98, das darauf abzielt, eine stabile, minimale, tragbar Version der Sprache und des zugehörigen Standards. Das Komitee erwartete und ermöglichte ausdrücklich, Erweiterungen der Sprache über . hinzuzufügen experimentelle Funktionen.[1]

Im Februar 1999 wurde der Standard für Haskell 98 veröffentlicht als Der Haskell 98-Bericht. Im Januar 2003 erschien eine überarbeitete Ausgabe als Haskell 98 Sprache und Bibliotheken: Der überarbeitete Bericht.[1] Die Sprache entwickelt sich weiter stark. Der Glasgow Haskell Compiler ist de facto die Standardimplementierung.[3]

Haskell 2010

Anfang 2006 wurden die ersten Schritte unternommen, um einen Nachfolger von Haskell 98 unter dem Namen Haskell Prime.[4] Ziel war es, inkrementelle Updates mit höchstens einer neuen Version pro Jahr zu produzieren. Die erste Überarbeitung, Haskell 2010, wurde im November 2009 angekündigt und im Juli 2010 veröffentlicht.[5]

Haskell 2010 ist ein inkrementelles Update, das mehrere häufig verwendete und nicht umstrittene Funktionen hinzufügt, die zuvor über Compiler-Flags aktiviert werden mussten:

  • Hierarchische Modulnamen., zB. Daten.Liste Anstatt von aufführen. Diese Funktionalität wurde Haskell 98 ursprünglich durch ein Addendum hinzugefügt und wird universell verwendet.
  • Mit der Fremdfunktionsschnittstelle ist es möglich, andere Programmiersprachen anzusprechen. Im Standard nur Bindungen an C definiert, aber das Design lässt andere Sprachen zu. Diese Funktion war ursprünglich auch ein Nachtrag zu Haskell 98.
  • Die sogenannte Patronen sind nicht mehr erlaubt.
  • Die Regeln bzgl Typ-Inferenz wurden gelockert, um den Programmen mehr Möglichkeiten zu geben.
  • Einige Syntaxprobleme wurden behoben.
  • das Pragma SPRACHE wurde hinzugefügt, um mit Erweiterungen besser zu arbeiten.

Implementierungen

Parallel zur Entwicklung der theoretischen Haskell-Sprache wurden eine Reihe von Arbeitsumgebungen für Haskell entwickelt. Die bekanntesten davon sind die Umarmungen- und Gofer-Systeme und die Glasgow Haskell Compiler, die alle von den daran arbeitenden Hochschulteams kostenlos zur Verfügung gestellt werden. Speziell zum Erlernen von Haskell ist die Universität UtrechtHelium mit Blick auf die Verständlichkeit der Fehlermeldungen entwickelt.

Im Nimwegen ist die Programmiersprache sauber die Haskell sehr ähnlich ist, dem Programmierer jedoch mehr Kontrolle über die faule Auswertung gibt.

Funktionsbasis

Im Gegensatz zu vielen bekannten Programmiersprachen wie C, C und Java ist Haskell Nr zwingende Sprache, aber ein funktionale Sprache. Das heißt, die Sprache basiert nicht auf dem Turing Maschine-Berechnungsmodell, aber auf der Modell der Lambda-Rechnung von Alonzo-Kirche bei denen sich bewerben Funktionen zu Konditionen und Laufzeitverkürzung ist die Berechnungsgrundlage.

Haskell ist ein faul ("faul"), rein funktionale Sprache. Rein funktional zu sein bedeutet, dass darin definierte Funktionen keine Nebenwirkungen aufweisen können. Beispiele für nicht-reine funktionale Programmiersprachen sind Standard-ML und planen. Verwenden einer faulen funktionalen Sprache faule Bewertung um nicht verwendete Berechnungsergebnisse zu vermeiden. Obwohl dies nicht von allen als intuitives Feature angesehen wird, wird die faule Evaluierung als eine Möglichkeit angesehen, mehr Modularisierung zu erreichen.

Die Programmiersprache ist stark und statisch typisiert (Tippfehler können während der Programmausführung nicht auftreten) und stützt sich stark auf Typ-Inferenz (normalerweise können die Typen von Funktionen und Variablen vom Compiler erkannt werden). Das Typsystem ist sehr umfangreich und unterstützt das Konzept von Typenklassen, wobei diese Klassen voneinander abgeleitet werden können.

Beispiele

Hallo Welt

ModulMain(Main)wo-- nicht benötigt mit Interpreter, Standard bei ModuldateienMain::IO()-- optional, der Compiler kann dies ermittelnMain=putStrLn"Hallo Welt!"

Fakultät

Die folgende Funktion berechnet die Fakultät einer Zahl. Für negative Werte ist die Funktion undefiniert. Es wird auf verschiedene Weise definiert:

-- Typanmerkung (optional, für jede Implementierung gleich)Fakultät::(Integralein)=>ein->ein-- Durch Rekursion (unter Verwendung des "ifthenelschen" Ausdrucks)Fakultätnein=wennnein<2dann1sonstnein*Fakultät(nein-1)-- mit Rekursion (mit Mustervergleich)Fakultät0=1Fakultätnein=nein*Fakultät(nein-1)-- mit Rekursion (mit Wachen)Fakultätnein|nein<2=1|Andernfalls=nein*Fakultät(nein-1)-- Mit einer Liste und der "Produkt"-FunktionFakultätnein=Produkt[1..nein]-- Mit Falz (bearbeitet "Produkt")Fakultätnein=falten(*)1[1..nein]-- Im "punktfreien" StilFakultät=Ordner(*)1.enumFromTo1

In eine Liste einfügen

Die folgende Funktion fügt eine Zahl in der Reihenfolge vom kleinsten zum größten in eine Liste ein:

einfügen::int->[int]->[int]einfügenein[]=[ein]einfügeneinaufführen@(X:xs)|ein<=X=ein:aufführen|ein>X=X:einfügeneinxs

Beim Einfügen einer Nummer lassen sich zwei Fälle unterscheiden: das Einfügen einer Nummer in eine leere Liste und in eine Liste mit einer oder mehreren Nummern. Das Einfügen in die leere Liste ist einfach, da dies eine Liste mit dieser Nummer ist. Beim Einfügen einer Zahl in eine gefüllte Liste betrachten wir die erste Zahl, X, und der Rest, xs. Wenn die einzufügende Zahl kleiner oder gleich der ersten Zahl ist, setzen wir die Zahl an den Anfang der gesamten Liste. Wenn die Zahl größer als die erste Zahl ist, nehmen wir das erste Element und fügen die Zahl in den Rest der Liste ein. Auf diese Weise wird die Liste fortgesetzt, bis die Stelle gefunden ist, an der die Nummer platziert werden kann.

Funktionen höherer Ordnung und Lazy Evaluation

In Haskell kann man Funktionen höherer Ordnung , dies sind Funktionen, die eine oder mehrere Funktion(en) als Argument annehmen oder eine Funktion zurückgeben. Beispiele dafür sind Mappe, Filter und falten. Die Funktion Filter Ruft beispielsweise eine Funktion (ein Prädikat) und eine Liste ab. Diese Funktion gibt eine Liste zurück, die nur die Elemente aus der angegebenen Liste enthält, die mit dem Prädikat übereinstimmen. Beispielsweise:

FilterEin bisschen[0..]

Das obige ergibt eine unendliche Liste von geraden Zahlen (formeller: alle Elemente aus der Liste [0, 1, 2, ..] für die die Funktion Ein bisschen der Wert wahr kehrt zurück). Die Tatsache, dass diese Liste unendlich ist, ist kein Problem, denn da Haskell Lazy Evaluation verwendet, muss die Liste nur bei Bedarf erstellt werden. So kann man schreiben:

nehmen10(Filterisprime[1..])

Die Funktion nehmen gibt die ersten n Elemente einer Liste zurück. Wenn die Funktion isprime (die bestimmt, ob eine Zahl eine Primzahl ist) dann ergibt das obige die ersten 10 Primzahlen.

Benutzen

Einige der Anwendungen, die in Haskell geschrieben wurden oder diese verwenden:

Kritik

2002 und 2003 diskutierte Jan-Willem Maessen bzw Simon Peyton Jones Probleme im Zusammenhang mit fauler Bewertung. Zusätzlich zu praktischen Erwägungen, wie einer besseren Leistung, machte es die faule Evaluierung für Programmierer schwieriger, über den Code nachzudenken.[11][12]

Andere beobachteten, dass Haskell für Anfänger nicht einfach zu erlernen ist:[13]

Die subtile Syntax und das ausgeklügelte Typensystem von Haskell sind ein zweischneidiges Schwert – von erfahrenen Programmierern sehr geschätzt, aber auch für Anfänger eine Quelle der Frustration, da die Allgemeinheit von Haskell oft zu kryptischen Fehlermeldungen führt.

Dies war auch einer der Gründe für Helium zu machen.

Verwandte Sprachen

sauber ist eine eng verwandte, aber etwas ältere Sprache von Haskell.

Eine Reihe von Sprachen, die von Haskell inspiriert wurden, jedoch mit einem anderen Typsystem, umfassen:

  • Agda, eine funktionale Sprache mit abhängigen Typen.
  • Idris, eine generische Funktionssprache, entwickelt am Universität St. Andrews.
  • Epigramm, eine funktionale Sprache, die zum Nachweis von Eigenschaften von Programmen verwendet wird
  • Cayenne, eine funktionale Sprache mit abhängigen Typen.
  • Ωmega, ein Dolmetscher ähnlich wie Umarmungen.
  • Elm, eine funktionale Sprache, die Web Applikationen damit zu tun.

Weiterlesen

Externe Links