ML(Meta Language:元词汇)是一个通用型的函数式C词汇。ML是动态返回值的。ML著名于采用了隐式的Hindley-Milner类别控制系统,它手动的选定多数函数的类别,不要求隐式的类别标示,而且能够保证类别安全,已经正式断定了有良好类别的ML流程不会导致运行时间类别严重错误。
ML提供了对函数实际模块的模块值、废弃物拆解、命令式程式设计、fork初始化和科尔曼化。它被大量的用作C词汇科学研究之中,因此是全面规定了的和采用方式句法校正了的极少数词汇之一。它的类别和模块值使得它适于因此经常用作在其它方式词汇上展开操作方式,比如在C++内部结构、手动化不等式断定和方式校正中。
ML是由剑桥大学的Robin Milner及别人在十九世纪六十年代晚期开发的,它的句法是从ISWIM得到的意念。ML是为了帮助在LCF不等式断定器中找寻断定思路而设想出来的,LCF的词汇是“pplambda”,联合了ii方法论程式设计和有类别的隐式的程式设计,拥有ML做为元词汇。
ML优点主要包括:fork初始化的解释器思路,丝尾函数,暗含废弃物搜集的手动缓存管理,模块隐式,动态类别,类别假设,拓扑数据类别,模块值和异常处理。
有别于Haskell,ML与多半数C词汇一样采用尽早解释器,换句话说所有的子函数总是被解释器,尽管能通过采用闭包来完成胶体解释器。因此能像Haskell那样建立和采用无穷流媒体,但它们的抒发是间接地的。
今天在ML家族企业许多种词汇:两种主要的吴语是Standard ML和OCaml,其它的主要包括F#,它是特别针对Microsoft .NET网络平台的对外开放科学研究项目。ML中的思想影响了众多的词汇,例如Haskell,Cyclone和Nemerle,ATS和Elm。
ML的整体实力多半被用作词汇设计和操作方式(C++、解析器、不等式断定器),但它做为通用型词汇也被用作生物信息和财务管理控制系统等领域。
ML特别是Standard ML是具有一些不单纯特征的函数式词汇。用ML书写的流程构成自要被解释器的函数,而非语句或命令,尽管一些函数返回一个平凡的unit值因此只为其副作用而解释器。
就像所有的函数式词汇一样,ML的关键特征是函数,它被用作展开抽象化。例如阶乘函数用纯ML可抒发为:
fun fac 0= 1
fac n = n * fac (n -1)
这里将阶乘描述为递归函数,具有一个单一的终止基础情况。它类似于在数学教科书见到的阶乘描述。多数ML代码在设施和语法上类似于数学。
凭借类别假设C++能推导出,fac接受整数0做为实际模块,则方式模块n也是整数类别int,而fac 0的结果是整数1,则函数fac的结果也是整数类别。函数fac接受一个整数的方式模块并返回一个整数结果,它做为一个整体从而有着“从整数到整数的函数”类别int -> int。函数及其方式模块的”类别”还能用类别标示(annotation)来描述,它是可选也可忽略的。它采用E : t表示法,能被读作函数E有类别t。采用类别标示,这个例子可重写为如下:
fac (n : int): int = n * fac (n -1)
这个函数还依赖于模块值,这是ML词汇的重要部分。注意函数形式模块不必须在圆括号内但要用空格分隔。当一个函数的实际模块是0,它将返回整数1。对于所有其它情况,尝试第二行。这是一个递归,因此再次执行这个函数直到达到基础情况。它能采用case函数重写为:
fun fac n = case n
of 0=>1
n => n * fac (n -1)
这里case介入了模式和对应函数的序列。它还能重写为将标识符绑定到lambda函数:
val rec fac =
fn 0=>1
这里的关键字val介入了标识符到值的绑定,fn介入了匿名函数的定义,它能用在fun的位置上,但采用=>算符而非=。绑定到递归的匿名函数需要采用rec关键字来指示。
通过将主要工作写入尾递归风格的内部迭代函数,借助于词汇编译或解释控制系统展开的尾初始化优化,这个函数能得以增进性能,它的初始化栈不需要随函数初始化数目而成比例的增长。对这个函数能采用向内部函数增加额外的“累加器”方式模块acc来实现:
fun fact n = let
fun fac (0, acc)= acc
fac (n, acc)= fac (n -1, n * acc)
in
fac (n,1)
end
let函数的值是在in和end之间函数的值。这个递归函数的实现不保证能够终止,因为负数实际模块会导致递归初始化的无穷降链条件。更健壮的实现会在递归前检查实际模块为非负数,并在有问题的情况,即n是负数的时候,启用异常处理:
if (n <0)
then raise Fail “negative argument”
else fac (n,1)
End




