Standard ML

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Standard ML
Paradigmen: funktional
Erscheinungsjahr: 1990
Entwickler: Robin Milner
Aktuelle Version: ’97  (1997)
Typisierung: stark, statisch, implizit
Wichtige Implementierungen: HaMLet, Moscow ML, MLj, ML Kit, MLton, MLWorks, Poly/ML, Poplog Standard ML, SML/NJ, SOSML
Beeinflusst von: ML
Beeinflusste: Ocaml, Haskell, Rust
www.standardml.org

Standard ML (SML) ist eine von ML abstammende funktionale Programmiersprache mit einigen imperativen Merkmalen (zum Beispiel im Bereich File IO).

ML-Schöpfer Robin Milner schlug SML 1983 vor, um die verschiedenen Dialekte von ML zu standardisieren. Die Sprache wurde von 1984 bis 1988 entwickelt und schließlich 1990 von Robin Milner, Mads Tofte und Robert Harper formalisiert. 1997 wurde mit SML'97 eine Revision der Sprache veröffentlicht, die neben einigen Vereinfachungen auch eine SML-Basisbibliothek enthält.

Wichtige Merkmale von SML sind unter anderem die statische Typisierung, Polymorphie auf Funktions- und Datentypsebene, automatische Speicherbereinigung sowie strenge Auswertung und Ausnahmebehandlung. Außerdem unterstützt SML Funktionen höherer Ordnung, Module und sogenannte Funktoren, die hier parametrisierte Datentypen bezeichnen.

Eine Besonderheit von SML ist, dass die Sprache vollständig formal definiert ist. Dadurch können wichtige Eigenschaften der Sprache mathematisch bewiesen werden.

Programmbeispiele

[Bearbeiten | Quelltext bearbeiten]

Rekursive Berechnung der Fakultät

[Bearbeiten | Quelltext bearbeiten]

Die Fakultät einer natürlichen Zahl kann man in SML mittels folgenden Programms berechnen:

fun fak (n) = if n < 1 then 1 else n * fak (n-1)

Rekursive Berechnung der Fibonaccizahlen

[Bearbeiten | Quelltext bearbeiten]

Die n-te Fibonacci-Zahl kann man in SML mittels folgenden Programms berechnen:

fun fib (0) = 0
  | fib (n) = if n <= 2 then 1 else fib(n-1) + fib(n-2)

Die Stelligkeit einer Zahl

[Bearbeiten | Quelltext bearbeiten]
fun stell (x:int) = if x<1 then 0 else stell(x div 10) + 1

Die Quersumme einer Zahl

[Bearbeiten | Quelltext bearbeiten]
fun quer (x:int) = if x<1 then 0 else quer(x div 10) + x mod 10

Die Faltungsprozedur foldl für Listen

[Bearbeiten | Quelltext bearbeiten]
fun foldl f s nil = s
  | foldl f s (x::xr) = foldl f (f(x,s)) xr

Das Umwandeln eines Strings, der eine Zahl darstellt, zu Int

[Bearbeiten | Quelltext bearbeiten]
fun toInt x = foldl(fn(i,k)=>ord(i)-ord #"0" + k*10) 0 (explode x)
fun insert (x, nil) = [x]
  | insert (x, y::yr) = if x<=y then x::y::yr else y::insert(x,yr)
fun isort xs = foldl insert nil xs
fun split xs = foldl (fn(i, (ys,zs)) =>(zs, i::ys)) (nil,nil) xs
fun merge (xs,nil) = xs
  | merge (nil,ys) = ys
  | merge (x::xr,y::yr) = if x<=y then x::merge(xr,y::yr) else y::merge(x::xr,yr)
fun mergesort nil = nil
  | mergesort [x] = [x]
  | mergesort xs = let val (ys,zs) = split(xs) in merge(mergesort ys, mergesort zs) end

"in situ"-Reversierung eines Arrays

[Bearbeiten | Quelltext bearbeiten]
fun reverse (a) = let
  fun swap l r = 
    let
      val vl = Array.sub(a,l)
      val vr = Array.sub(a,r)
    in
      if l >= r then () else
        (Array.update(a,l,vr); Array.update(a,r,vl);swap (l+1) (r-1))
    end
  in
    swap (0) (Array.length (a) -1)
  end;

Implementierungen

[Bearbeiten | Quelltext bearbeiten]

Es existieren verschiedene Compiler für SML, die entweder Bytecode oder Maschinencode generieren. Die Referenzimplementierung ist SML/NJ. Sml2c ist ein besonderer Compiler, der SML in C Code übersetzt.

  • Robin Milner, Mads Tofte, Robert Harper, D. MacQueen: The Definition of Standard ML (Revised). MIT Press, 1997, ISBN 0-262-63181-4 (offizielle Sprachdefinition).
  • Gert Smolka: Programmierung – eine Einführung in die Informatik mit Standard ML. Oldenbourg Wissenschaftsverlag, München 2008, ISBN 978-3-486-58601-5