变体

变体对结构是双重的。而结构表示“这个、那个和其他”,而变量则表示“这个或那个或其他”,换句话说,是替代品。

定义

我们已经遇到了一个常见的变体,选项类型:

variant opt[t] =
| None
| Some of t
;

名字 NoneSome 有时被称为 类型构造函数 . 当它们用于生成变量类型的值时,它们是函数,称为 注入函数 因为它们将参数注入变量类型。

施工

下面是如何生成选项类型的值:

var n = None[int];
var s = Some 42;

注意,对于 None 我们必须提供实例类型 t 在这种情况下 int . 对于 Some 案例,实例 int 属于 t 是由过载分辨率推导出来的,因此可以省去。

提取

注入是条件可逆的,也就是说,逆函数就是我所说的偏函数 提取器 . 可以将这些用于模式匹配:

fun show (x:opt[int]) =>
  match x with
  | None => "None"
  | Some i => "Some(" + i.str + ")"
;

Felix“知道”哪个注入用于构造变量值,并从 match 表达式。这样可以确保提取器定义良好。对于 Some branch,提取集 i 用于构造值的注入函数的参数。