ML (Programmiersprache)

ML ist eine funktionelle Mehrzweckprogrammiersprache, die von Robin Milner und anderen am Anfang der 1970er Jahre an der Universität Edinburghs entwickelt ist, dessen Syntax durch ISWIM begeistert wird. Historisch tritt ML für Metasprache ein: Es wurde konzipiert, um Probetaktik im LCF Lehrsatz prover zu entwickeln (dessen Sprache, pplambda, eine Kombination der Prädikat-Rechnung der ersten Ordnung und der einfach getippten polymorphen Lambda-Rechnung, ML als seine Metasprache hatte). Es ist für seinen Gebrauch des Typ-Interferenzalgorithmus von Hindley-Milner bekannt, der die Typen von den meisten Ausdrücken automatisch ableiten kann, ohne ausführliche Typ-Anmerkungen zu verlangen.

Übersicht

ML wird häufig eine unreine funktionelle Sprache genannt, weil er Nebenwirkungen verschieden von rein funktionellen Programmiersprachen wie Haskell kurz zusammenfasst.

Eigenschaften von ML schließen eine Einschätzungsstrategie des Anrufs durch den Wert, erstklassige Funktionen, automatisches Speichermanagement durch Müll-Sammlung, parametrischen polymorphism, das statische Schreiben, die Typ-Schlussfolgerung, die algebraischen Datentypen, das Muster-Zusammenbringen und das Ausnahme-Berühren ein.

Verschieden von Haskell verwendet ML eifrige Einschätzung, was bedeutet, dass alle Subausdrücke immer bewertet werden. Jedoch kann faule Einschätzung durch den Gebrauch von Verschlüssen erreicht werden. So kann man schaffen und unendliche Ströme als in Haskell verwenden, aber ihr Ausdruck ist verhältnismäßig indirekt.

Heute gibt es mehrere Sprachen in der ML Familie; die zwei Hauptdialekte sind Normaler ML (SML) und Caml, aber andere, bestehen einschließlich F# — eine Sprache, die Microsoft für ihre.NET Plattform unterstützt. Ideen von ML haben viele andere Sprachen, wie Haskell, Zyklon und Nemerle beeinflusst.

Die Kräfte von ML werden größtenteils im Sprachdesign und der Manipulation angewandt (Bearbeiter, Analysatoren, Lehrsatz provers), aber es ist eine Allzwecksprache, die auch in bioinformatics, Finanzsystemen, und Anwendungen einschließlich einer genealogischen Datenbank, einem Gleicher-zu-Gleicher-Programm des Kunden/Servers usw. verwendet ist.

ML verwendet statische Scoping-Regeln.

Beispiele

Die folgenden Beispiele verwenden die Syntax von Normalem ML. Der andere am meisten weit verwendete ML Dialekt, OCaml, unterscheidet sich auf verschiedene unkörperliche Weisen.

Factorial

Die als reiner ML ausgedrückte Factorial-Funktion:

Spaß fac (0: interne Nummer): interne Nummer = 1

| fac (n: interne Nummer): interne Nummer = n * fac (n - 1)

</Quelle>

Das beschreibt den factorial als eine rekursive Funktion mit einem einzelnen endenden Grundfall. Es ist den Beschreibungen von in Mathematik-Lehrbüchern gefundenem factorials ähnlich. Viel ML-Code ist der Mathematik in der Möglichkeit und Syntax ähnlich.

Ein Teil der gezeigten Definition ist fakultativ, und beschreibt die Typen dieser Funktion. Die Notation E: T kann gelesen werden, weil Ausdruck E Typ t hat. Zum Beispiel ist das Argument n zugeteilte ganze Typ-Zahl (interne Nummer) und fac (n: Interne Nummer), das Ergebnis, fac auf die ganze Zahl n anzuwenden, hat auch ganze Typ-Zahl. Die Funktion fac hat als Ganzes dann Typ-Funktion von der ganzen Zahl bis ganze Zahl (interne Nummer-> interne Nummer). Dank der Typ-Schlussfolgerung können die Typ-Anmerkungen weggelassen werden und werden durch den Bearbeiter abgeleitet. Umgeschrieben ohne die Typ-Anmerkungen ist das Beispiel ähnlich:

Spaß fac 0 = 1

| fac n = n * fac (n - 1)

</Quelle>

Die Funktion verlässt sich auch auf das Muster-Zusammenbringen, einen wichtigen Teil der ML-Programmierung. Bemerken Sie, dass Rahmen einer Funktion nicht notwendigerweise in Parenthesen, aber getrennt durch Räume sind. Wenn das Argument der Funktion 0 (Null) ist, wird es die ganze Zahl 1 (ein) zurückgeben. Für alle anderen Fälle wird die zweite Linie versucht. Das ist der recursion, und führt die Funktion wieder durch, bis der Grundfall erreicht wird.

Wie man

versichert, endet diese Durchführung der Factorial-Funktion nicht, da ein negatives Argument eine unendliche hinuntersteigende Kette von rekursiven Anrufen verursacht. Eine robustere Durchführung würde für ein nichtnegatives Argument vor dem Wiederfluchen wie folgt überprüfen:

lustige Tatsache n = hat gelassen

Spaß fac 0 = 1

| fac n = n * fac (n - 1)

in

wenn (n

Der problematische Fall (wenn n negativ ist) demonstriert einen Gebrauch des Ausnahme-Systems von ML.

Die Funktion kann weiter durch das Schreiben seiner inneren Schleife in einem mit dem Schwanz rekursiven Stil, solch verbessert werden, dass der Anruf-Stapel im Verhältnis zur Zahl von Funktionsanrufen nicht zu wachsen braucht. Das wird durch das Hinzufügen eines zusätzlichen, "Akkumulators", Parameters zur inneren Funktion erreicht. Schließlich erreichen wir

Spaß factorial n = hat gelassen

Spaß fac (0, acc) = acc

| fac (n, acc) = fac (n - 1, n*acc)

in wenn (n

Listenrückseite

Die folgende Funktion "kehrt" die Elemente in einer Liste "um". Genauer gibt es eine neue Liste zurück, deren Elemente in umgekehrter Reihenfolge im Vergleich zur gegebenen Liste sind.

lustige Rückseite [] = []

| Rückseite (x:: Xs) = (kehren xs um) [x]

</Quelle>

Diese Durchführung der Rückseite, während richtig und klar, ist ineffizient, quadratische Zeit für die Ausführung verlangend. Die Funktion kann umgeschrieben werden, um in der geradlinigen Zeit mit dem folgenden effizienteren, obwohl weniger easy-read, Stil durchzuführen:

lustige Rückseite xs = hat gelassen

die lustige Umdrehung [] acc = acc

| Umdrehung (hd:: tl) acc = Umdrehung tl (hd:: acc)

in

Umdrehung xs []

Ende

</Quelle>

Namentlich ist diese Funktion ein Beispiel von parametrischem polymorphism. D. h. es kann Listen verbrauchen, deren Elemente jeden Typ und Rücklisten desselben Typs haben.

Siehe auch

F#
  • Haskell
  • ISWIM
  • LCF Lehrsatz prover
  • Nemerle
  • Scala
  • ACL2

Dialekte

  • Alice
  • Caml, ein Dialekt von ML, der geworden ist...

:* Moskau ML - eine populäre Durchführung von Normalem ML ist vom Licht von Caml hinuntergestiegen

:* OCaml, der berühmte Dialekt von Caml mit der Unterstützung für die objektorientierte Programmierung

F#
  • LML (fauler ML)
  • Mythryl
  • Rpal
  • Normaler ML, ein Dialekt von ML mit einer formellen Semantik

Bücher

  • Die Definition von Normalem ML, Robin Milner, Mads Tofte, Robert Harper, MIT Presse 1990; (Verbesserte Auflage fügt Autor David MacQueen hinzu), MIT Presse 1997. Internationale Standardbuchnummer 0-262-63181-4
  • Kommentar zu Normalem ML, Robin Milner, Mads Tofte, MIT Presse 1997. Internationale Standardbuchnummer 0-262-63137-7
  • ML für den Arbeitsprogrammierer, L.C. Paulson, die Universität von Cambridge Presse 1991, 1996, internationale Standardbuchnummer 0-521-57050-6
  • Robert Harper: "In Normalem ML", Universität von Carnegie Mellon, 2005 programmierend.
  • Elemente der ML-Programmierung, Jeffrey D. Ullmans, des Prentice-Saals 1994, 1998. Internationale Standardbuchnummer 0-13-790387-1

Links


Millbridge, Plymouth / Unordentlicherer Gegenstand
Impressum & Datenschutz