ML语言

维基百科,自由的百科全书
跳转至: 导航搜索
ML
编程范型 多范型: 指令式, 函数式
发行时间 1973年
設計者 Robin Milner & 爱丁堡大学其他人
型態系統 静态类型, 强类型, 类型推论
衍生副語言 Standard ML, OCaml, F#
啟發語言 ISWIM
影響語言 Miranda, Haskell, Cyclone, Nemerle, C++, F♯, Clojure, Opa, Erlang

ML 是一个通用的函數式編程语言,它是由爱丁堡大学Robin Milner及他人在二十世纪七十年代晚期开发的。它的语法是从ISWIM得到的灵感。作为元语言的ML是为了帮助在LCF定理证明机中寻找证明策略而构想出来的。(之前的元语言是pplambda,它联合了一阶逻辑演算和有类型的多态λ演算)。它使用了Hindley-Milner类型推论算法来推测大多数值的类型,而不需要四处使用注解。

ML一般被归为非纯函数式编程语言,因为它允许副作用和指令式编程。这一点和纯函数式编程语言——例如Haskell——很不一样。

ML特性包括:傳值呼叫(Call by value)的求值策略,一级函数, 带有垃圾收集的自动内存管理, 参数多态,静态数据类型类型推论,代数数据类型,模式匹配异常处理

不像Haskell,ML使用热情求值,也就是说所有的子表达式总是被求值。导致的一个结果是你不能使用无穷表。然而,惰性求值产生的无穷表可以通过使用匿名函数来模拟。

今天在ML家族中有好几种语言:两种主要的方言是Standard MLCaml,其他的包括F# - 针对Microsoft .NET平台的开放研究项目。 ML中的思想影响了众多的语言,例如HaskellCycloneNemerle

ML的实力大多被用于语言设计和操作(编译器、分析器、定理证明机), 但是它作为通用语言也被用于生化,金融系统,和宗谱数据库,一个P2P的客户/服务器程序等等。

ML例子[编辑]

剖析一个ML函数[编辑]

函数式编程语言的"Hello World" 程序是阶乘函数。用纯ML表达就是:

fun fac : (fn: int -> int) 0 = 1
   | fac n = n * fac (n-1);

阶乘在这里被描述成一个递归函数,它有一个终止条件。可以看出它和数学课本中对于阶乘的描述很相似。很多ML代码的语法类似数学。

递归函数第一行的一部分是可选的,描述了函数的类型。可以这么读:函数fac (fun fac) 是一个 (:) 由整数至整数的函数 (fn: int -> int)。也就是说,函数以一个整数作为参数,返回另一个整数。去掉非必要的类型声明后,这个函数如下:

fun fac 0 = 1
   | fac n = n * fac(n-1);

这个函数也依赖模式匹配,ML编程的重要部分。 注意一个函数的参数不是在圆括号中而是由空格分开。当函数的参数值为0时返回整数1。其他情况下将会尝试第二行。这一个递归,将会再一次调用函数直到满足基准条件。

参见[编辑]

外部链接[编辑]