Records

A record type groups a fixed set of named fields, each with its own type. Record types are introduced as type aliases, listing the fields between curly braces and separating them with semicolons:

type rat = { n: real; d: real };

A record value is constructed by giving a value to each field, using the type name followed by the field assignments (note that fields are assigned with =):

r = rat { n = 1.0; d = 2.0 };

The field f of a record r is accessed with the dot syntax r.f. For instance, r.n evaluates to 1.0 for the record r above.

Element update

A new record that is identical to an existing one except at selected fields can be constructed with the element update syntax r[f := v]. It denotes a copy of the record r in which field f is replaced by v; the original record r is not modified. For example,

type rat = { n: real; d: real };
node x (r: rat) returns (y: rat)
let
  y = r[n := r.n * 2.0];
tel

defines y to be equal to r except that its n field is doubled. Several fields can be updated at once by separating the individual updates with semicolons, as in r[n := 1.0; d := 2.0].