匹配记录字段

模式匹配可用于解构记录。我们用表示文本文件中位置的记录类型来说明这一点,例如程序的源代码。

type location = {
  filename : string;
  line: int;
  column: int;
  offset: int;
}

可以解构类型位置的值 x,如下所示:

let { filename; line; column; offset; } = x

类似的语法可用于定义函数,例如打印位置的函数:

let print_location { filename; line; column; offset; } =
  Printf.printf "%s: %d: %d" filename line column

或者

let print_location = function { filename; line; column; offset; } ->
  Printf.printf "%s: %d: %d" filename line column

匹配记录的模式不需要提及记录的所有字段。由于该函数不使用 offset 字段,我们可以将其删除:

let print_location { filename; line; column; } =
  Printf.printf "%s: %d: %d" filename line column

在模块中定义记录时,足以限定模式中出现的第一个字段:

module Location =
struct
  type t = {
      filename : string;
      line: int;
      column: int;
      offset: int;
    }
end

let print_location { Location.filename; line; column; } =
  Printf.printf "%s: %d: %d" filename line column