Standard ML
| Standard ML | |
|---|---|
| Basisdaten | |
| 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
Rekursive Berechnung der Fakultät
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
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
fun stell (x:int) = if x<1 then 0 else stell(x div 10) + 1
Die Quersumme einer Zahl
fun quer (x:int) = if x<1 then 0 else quer(x div 10) + x mod 10
Die Faltungsprozedur foldl für Listen
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
fun toInt x = foldl(fn(i,k)=>ord(i)-ord #"0" + k*10) 0 (explode x)
Insertsort
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
Mergesort
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
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
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.
- HaMLet
- MLton (stark optimierender Compiler)
- Moscow ML(alte Webseite verfügbar unter http://www.itu.dk/~sestoft/mosml.html)
- Standard ML of New Jersey
- Alice ML
- Poly/ML
- sml2c (C Code)
- SML.NET (Bytecode)
- Poplog (IDE für Forschung und Lehre im Bereich Künstliche Intelligenz)
- CakeML
- SOSML
Literatur
- 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
Weblinks
- Mads Tofte: Standard ML Language. In: Scholarpedia. (englisch, inkl. Literaturangaben)
- Robert Harper: Programming in Standard ML. (PDF, 756 kB)
- Programming in Standard ML ’97: A Tutorial Introduction.
- The Standard ML Basis Library
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.