Standard ML
Standard ML | |
---|---|
Paradigms : | functional |
Publishing year: | 1990 |
Developer: | Robin Milner |
Current version : | '97 (1997) |
Typing : | strong, static, implicit |
Important implementations : | HaMLet, Moscow ML, MLj, ML Kit, MLton, MLWorks, Poly / ML, Poplog Standard ML, SML / NJ , SOSML |
Influenced by: | ML |
Affected: | Ocaml , Haskell , Rust |
www.standardml.org |
Standard ML ( SML ) is a functional programming language derived from ML with some imperative features (for example in the area of File IO).
ML creator Robin Milner proposed SML in 1983 to standardize the various dialects of ML. The language was developed from 1984 to 1988 and finally formalized in 1990 by Robin Milner, Mads Tofte and Robert Harper. In 1997 , with SML'97, a revision of the language was published which, in addition to some simplifications, also contains an SML basic library.
Important characteristics of SML include static typing , polymorphism at the function and data type level, automatic garbage collection, and strict evaluation and exception handling . In addition, SML supports higher-order functions , modules and so-called functors , which here denote parameterized data types.
A special feature of SML is that the language is completely formally defined. Thereby important properties of the language can be proven mathematically .
Program examples
Recursive calculation of the factorial
The factorial of a natural number can be calculated in SML using the following program:
fun fak (n) = if n < 1 then 1 else n * fak (n-1)
Recursive calculation of the Fibonacci numbers
The nth Fibonacci number can be calculated in SML using the following program:
fun fib (0) = 0
| fib (n) = if n <= 2 then 1 else fib(n-1) + fib(n-2)
The arity of a number
fun stell (x:int) = if x<1 then 0 else stell(x div 10) + 1
The checksum of a number
fun quer (x:int) = if x<1 then 0 else quer(x div 10) + x mod 10
The folding procedure foldl for lists
fun foldl f s nil = s
| foldl f s (x::xr) = foldl f (f(x,s)) xr
Converting a string that represents a number to int
fun toInt x = foldl(fn(i,k)=>ord(i)-ord #"0" + k*10) 0 (explode x)
Insert location
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
Merge sort
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" reversal of an array
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;
Implementations
There are different compilers for SML that generate either bytecode or machine code. The reference implementation is SML / NJ. Sml2c is a special compiler that translates SML into C code.
- HaMLet
- MLton (highly optimizing compiler)
- Moscow ML
- Standard ML of New Jersey
- Alice ML
- Poly / ML
- sml2c (C code)
- SML.NET (bytecode)
- Poplog (IDE for research and teaching in the field of artificial intelligence )
- CakeML
- SOSML
literature
- Robin Milner , Mads Tofte, Robert Harper, D. MacQueen: The Definition of Standard ML (Revised) . MIT Press, 1997, ISBN 0-262-63181-4 (official language definition).
- Gert Smolka : Programming - an introduction to computer science with Standard ML . Oldenbourg Wissenschaftsverlag, Munich 2008, ISBN 978-3-486-58601-5
Web links
- Mads Tofte: Standard ML Language . In: Scholarpedia . (English, including references)
- Robert Harper: Programming in Standard ML . (PDF, 756 kB)
- Programming in Standard ML '97: A Tutorial Introduction .
- The Standard ML Basis Library