Content deleted Content added
Pbsouthwood (talk | contribs) Adding local short description: "General purpose functional programming language", overriding Wikidata description "functional programming language" (Shortdesc helper) |
Jerryobject (talk | contribs) m WP:LINK update-standardize. |
||
(68 intermediate revisions by 48 users not shown) | |||
Line 1:
{{
{{Other uses|ML (disambiguation){{!}}ML}}
{{More citations needed|date=
{{Infobox programming language
| name
| logo
| paradigm
| year = {{start date and age|1973}}▼
▲| designer = [[Robin Milner]] and others at the [[University of Edinburgh]]
▲| developer =
| latest release version =
| latest release date
| typing
| implementations
| dialects
| influenced by
| influenced
| operating system
| license
| website
}}
'''ML''' (
▲'''ML''' ("Meta Language") is a general-purpose [[functional programming language]]. It has roots in [[Lisp (programming language)|Lisp]], and has been characterized as "Lisp with types".{{citation needed|date=January 2019}} ML is a statically-scoped functional programming language like Scheme. It is known for its use of the polymorphic [[Hindley–Milner type system]], which automatically assigns the [[data type|types]] of most [[Expression (programming)|expressions]] without requiring explicit type annotations, and ensures type safety{{snd}}there is a formal proof that a well-typed ML program does not cause runtime type errors.<ref>Robin Milner. A theory of type polymorphism in programming. Journal of Computer and System Sciences, 17(3):348–375, 1978.</ref> ML provides pattern matching for function arguments, [[Garbage collection (computer science)|garbage collection]], [[imperative programming]], [[call-by-value]] and [[currying]]. It is used heavily in programming language research and is one of the few languages to be completely specified and verified using [[Formal semantics of programming languages|formal semantics]]. Its types and pattern matching make it well-suited and commonly used to operate on other formal languages, such as in [[compiler writing]], [[automated theorem proving]], and [[formal verification]].
==Overview==
Features of ML include a call-by-value [[evaluation strategy]], [[first-class function]]s, automatic memory management through
ML can be referred to as an ''impure'' functional language, because although it encourages functional programming, it does allow [[side-effect (computer science)|side-effects]]<ref>{{cite book |last1=Sebesta |first1=Robert |title=Concepts of Programming Languages |date=1999 |publisher=Addison-Westley |isbn=0-201-38596-1 |page=54 |edition=4th}}</ref> (like languages such as [[Lisp (programming language)|Lisp]], but unlike a [[purely functional language]] such as [[
ML's strengths are mostly applied in language design and manipulation (compilers, analyzers, theorem provers), but it is a general-purpose language also used in [[bioinformatics
ML was developed by [[Robin Milner]] and others in the early 1970s at the [[University of Edinburgh]],<ref name="Gordon1996">{{cite web |
Today there are several languages in the ML family; the three most prominent are [[Standard ML]] (SML), [[OCaml]] and [[F Sharp (programming language)|F#]]. Ideas from ML have influenced numerous other languages, like [[Haskell]], [[Cyclone (programming language)|Cyclone]], [[Nemerle]],<ref>{{Citation |title=Programming language for "special forces" of developers |publisher=Nemerle Project Team |publication-place=Russian Software Development Network |url=http://nemerle.org/About |access-date=January 24, 2021}}</ref> [[ATS (programming language)|ATS]],
==Examples==
The following examples use the syntax of Standard ML. Other ML dialects such as
===Factorial===
The [[factorial]] function expressed as pure ML:
<
fun fac (0 : int) : int = 1
| fac (n : int) : int = n * fac (n - 1)
</syntaxhighlight>
This describes the factorial as a recursive function, with a single terminating base case. It is similar to the descriptions of factorials found in mathematics textbooks. Much of ML code is similar to mathematics in facility and syntax.
Line 48:
Part of the definition shown is optional, and describes the ''types'' of this function. The notation E : t can be read as ''expression E has type t''. For instance, the argument n is assigned type ''integer'' (int), and fac (n : int), the result of applying fac to the integer n, also has type integer. The function fac as a whole then has type ''function from integer to integer'' (int -> int), that is, fac accepts an integer as an argument and returns an integer result. Thanks to type inference, the type annotations can be omitted and will be derived by the compiler. Rewritten without the type annotations, the example looks like:
<
fun fac 0 = 1
| fac n = n * fac (n - 1)
</syntaxhighlight>
The function also relies on pattern matching, an important part of ML programming. Note that parameters of a function are not necessarily in parentheses but separated by spaces. When the function's argument is 0 (zero) it will return the integer 1 (one). For all other cases the second line is tried. This is the [[Recursion (computer science)|recursion]], and executes the function again until the base case is reached.
This implementation of the factorial function is not guaranteed to terminate, since a negative argument causes an [[infinite descending chain]] of recursive calls. A more robust implementation would check for a nonnegative argument before recursing, as follows:
<
fun fact n = let
fun fac 0 = 1
| fac n = n * fac (n - 1)
in
if (n < 0) then raise
end
</syntaxhighlight>
The problematic case (when n is negative) demonstrates a use of ML's
The function can be improved further by writing its inner loop
<
fun fact n = let
fun fac 0 acc = acc
| fac n acc = fac (n - 1) (n * acc)
in
if (n < 0) then raise
end
</syntaxhighlight>
===List reverse===
The following function
<
fun reverse [] = []
| reverse (x :: xs) = (reverse xs) @ [x]
</syntaxhighlight>
This implementation of reverse, while correct and clear, is inefficient, requiring [[quadratic time]] for execution. The function can be rewritten to execute in [[linear time]]
<
fun 'a reverse xs : 'a list =
</syntaxhighlight>
▲Notably, this function is an example of parametric polymorphism. That is, it can consume lists whose elements have any type, and return lists of the same type.
===Modules===
Modules are ML's system for structuring large projects and libraries. A module consists of a signature file and one or more structure files. The signature file specifies the [[API]] to be implemented (like a C header file, or [[Interface (Java)|Java interface]] file).
<
signature ARITH =
sig
type t
val zero : t
val
▲ val sum : t * t -> t;
end
</syntaxhighlight>
<
structure Rational : ARITH =
struct
datatype t = Rat of int * int
val zero = Rat (0, 1)
fun succ (Rat (a, b)) = Rat
fun sum (Rat (a, b),
end
</syntaxhighlight>
These are imported into the interpreter by the 'use' command. Interaction with the implementation is only allowed via the signature functions, for example it is not possible to create a 'Rat' data object directly via this code. The 'structure' block hides all the implementation detail from outside.
Line 131 ⟶ 122:
==See also==
* [[Standard ML]] and
* [[Dependent ML]]: a dependently typed extension of ML
** [[
* [[PAL (programming language)]]: an educational language related to ML
* [[OCaml]]: an ML dialect used to implement [[Coq (software)|Coq]] and [[OCaml#Software written in OCaml|various software]]
▲* [[Lazy ML]], an experimental lazily evaluated ML dialect from the early 1980s
▲* [[PAL (programming language)]], an educational language related to ML
==References==
Line 146 ⟶ 134:
==Further reading==
{{refbegin}}
* ''The Definition of Standard ML'', Robin Milner, [[Mads Tofte]], [[Robert Harper (computer scientist)|Robert Harper]], MIT Press 1990; (revised edition adds author David MacQueen), MIT Press 1997, {{ISBN|0-262-63181-4}} [https://smlfamily.github.io/sml97-defn.pdf The Definition of Standard ML (Revised)].
* ''Commentary on Standard ML'', [[Robin Milner]], [[Mads Tofte]], MIT Press 1997, {{ISBN|0-262-63137-7}}.
* ''ML for the Working Programmer'', [[Lawrence Paulson]], Cambridge University Press 1991, 1996, {{ISBN|0-521-57050-6}}.
* {{cite book |url=https://www.cs.cmu.edu/~rwh/isml/book.pdf
* ''Elements of ML Programming'', [[Jeffrey D. Ullman]], Prentice-Hall 1994, 1998, {{ISBN|0-13-790387-1}}.
{{refend}}
==External links==
* [http://smlnj.org Standard ML of New Jersey, another popular implementation]
* [http://msdn.microsoft.com/en-us/fsharp/default.aspx F#, an ML implementation using the Microsoft .NET framework] {{Webarchive|url=https://web.archive.org/web/20100218004857/http://msdn.microsoft.com/en-us/fsharp/default.aspx |date=2010-02-18}}
* [http://mlton.org MLton, a whole-program optimizing Standard ML compiler]
* [https://cakeml.org CakeML, a read-eval-print loop version of ML with formally verified runtime and translation to assembler]
{{ML programming}}
{{Programming languages}}
{{Authority control}}
{{DEFAULTSORT:ML (Programming Language)}}
[[Category:Academic programming languages]]
[[Category:Functional languages]]
▲[[Category:Procedural programming languages]]
[[Category:ML programming language family]]
[[Category:Pattern matching programming languages]]
[[Category:
[[Category:Programming languages created in 1973]]
[[Category:Statically typed programming languages]]
|