Record types

In the type declarations discussed above, the arguments to each data constructor are nameless. For example:

structural type Point1
structural type Point1 = Point2 Nat Nat

Here, the data typePoint1has a constructorPoint2,with two arguments, both of typeNat.The arguments have no name, so they are identified positionally, for example when creating a value of this type, likePoint2 1 2.

Types with a single data constructor can also be defined in the following style, in which case they are calledrecord types.

Point2 = {x : Nat, y : Nat}

This assigns names to each argument of the constructor. The effect of this is to generate some accessor methods, to help get, set, and modify each field.

Note thatx.setandx.modifyare returning new, modified copies of the input record--there's no mutation of values in Unison.

There's currently no special syntax for creating, pattern matching, or decomposing records. That works the same as for regular data types:

p = Point2 1 2 let (Point2 x _) = p x