标准 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
- 编译器和解释器