ML语言

ML是一个通用的函數式編程语言,它是由爱丁堡大学Robin Milner及他人在二十世纪七十年代晚期开发的,它使用了Hindley-Milner类型推论算法来推测大多数值的类型。ML一般被归为非纯函数式编程语言,因为它允许副作用和指令式编程

ML
多范型函数式指令式
設計者Robin Milner & 爱丁堡大学其他人
1973年1973
型態系統类型推论静态类型强类型
衍生副語言
Standard ML, OCaml, F#
啟發語言
ISWIM
影響語言
ClojureCoqCycloneC++ElmF#F*HaskellIdrisMirandaNemerleOCamlOpaErlangRustScalaStandard ML

概述

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

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

它的语法是从ISWIM得到的灵感。作为“元语言”的ML是为了帮助在LCF定理证明机中寻找证明策略而构想出来的。之前的元语言是“pplambda”,它联合了一阶逻辑演算和有类型的多态λ演算

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

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

ML例子

剖析一个ML函数

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

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

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

关于参数类型(int)和返回值类型(int)的声明是可选的。上述声明强制保证了函数 fac 是一个 由整数至整数的函数 (fn: int -> int)。也就是说,函数以一个整数作为参数,返回另一个整数。去掉非必要的类型声明后,这个函数如下:

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

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

参见

  • OCaml, ML的一种方言,支持面向对象编程
  • 新泽西Standard ML,Standard ML的一种实现

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.