跳转到内容

标准 ML 编程

25% developed
来自维基教科书,开放的书籍,开放的世界

由于本书远未完成,因此现有页面列于此处。

  1. 类型
  2. 表达式
  3. 示例和练习
  4. 解决方案

关于标准 ML

[编辑 | 编辑源代码]

标准 ML (SML) 属于 ML 编程语言家族。与该家族的其他成员(如 OCaml)一样,它的特点是强类型静态类型推断、严格求值和模块系统,该系统具有签名、结构和函子。当前标准来自 1997 年;它取代了 1990 年的早期标准,之后的标准被称为继任者 ML (sML)。

语法示例

[编辑 | 编辑源代码]

以下代码段定义了一个函数 factorial,该函数计算非负整数 n 的阶乘。

local
  val rec fac = fn 0 => 1 | n => n * fac (n - 1)
in
  fun factorial n = if n < 0 then raise Domain else fac n
end;

一个重要的说明:在 SML/NJ 的交互式顶层,终端分号对于评估到目前为止的代码是必需的,但分号通常是可选的作为语句终止符;它仅在分离顺序表达式时是必需的。

以下代码段定义了一个函数 gray_code,该函数将整数 n 映射到一个包含所有不同的n 字符串的列表,其中包含 0 和 1,按格雷码顺序排列,使得每个元素与其相邻元素在恰好一个字符上不同,然后计算一个三数字格雷码的字符串,该字符串等于 "000-001-011-010-110-111-101-100"

fun prefix p s  = String.concat [p, s];
fun extend p xs = List.map (prefix p) xs;

fun expand prev = extend "0" prev @ List.rev (extend "1" prev);
fun gray_code n = if n < 1 then [""] else expand (gray_code (n - 1));

fun print_line a = print a before print "\n";
print_line (String.concatWith "-" (gray_code 3));

开始使用标准 ML 的先决条件是编译器,大多数编译器直接生成机器代码;然而,像大多数动态语言一样,几个 SML 编译器提供了一个交互式顶层,它根据需要编译和评估代码,这对于新生和低年级学生来说可能很方便。

外部资源

[编辑 | 编辑源代码]
关于标准 ML
编译器和解释器
  • MLton:一个没有交互式顶层的全程序优化编译器
  • 新泽西标准 ML:一个带有交互式顶层和库的编译器
  • Alice ML:一个带有 GUI 的跨平台解释器
华夏公益教科书