Pattern matching can be used to deconstruct records. We illustrate this with a record type representing locations in a text file, e.g. the source code of a program.
type location = {
  filename : string;
  line: int;
  column: int;
  offset: int;
}
A value x of type location can be deconstructed like this:
let { filename; line; column; offset; } = x
A similar syntax can be used to define functions, for instance a function to print locations:
let print_location { filename; line; column; offset; } =
  Printf.printf "%s: %d: %d" filename line column
or alternatively
let print_location = function { filename; line; column; offset; } ->
  Printf.printf "%s: %d: %d" filename line column
Patterns matching records do not need to mention all fields of a record. Since the function does not use the offset field, we can leave it out:
let print_location { filename; line; column; } =
  Printf.printf "%s: %d: %d" filename line column
When the record is defined in a module, it is enough to qualify the first field occurring in the pattern:
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