You are currently looking at the < v8.2.0 docs (Reason v3.6 syntax edition). You can find the latest manual page here.

(These docs cover all versions between v3 to v8 and are equivalent to the old BuckleScript docs before the rebrand)

Tuple

Tuples are a ReScript-specific data structure that don't exist in JavaScript. They are:

  • immutable

  • ordered

  • fix-sized at creation time

  • heterogeneous (can contain different types of values)

Reason (Old Syntax)ML (Older Syntax)JS Output
let ageAndName = (24, "Lil' ReScript");
let my3dCoordinates = (20.0, 30.5, 100.0);

Tuples' types can be used in type annotations as well. Tuple types visually resemble tuples values.

Reason (Old Syntax)ML (Older Syntax)JS Output
let ageAndName: (int, string) = (24, "Lil' ReScript");
// a tuple type alias
type coord3d = (float, float, float);
let my3dCoordinates: coord3d = (20.0, 30.5, 100.0);

Note: there's no tuple of size 1. You'd just use the value itself.

Usage

To get a specific member of a tuple, destructure it:

Reason (Old Syntax)ML (Older Syntax)JS Output
let (_, y, _) = my3dCoordinates; // now you've retrieved y

The _ means you're ignoring the indicated members of the tuple.

Tuples aren't meant to be updated mutatively. You'd create new ones by destructuring the old ones:

Reason (Old Syntax)ML (Older Syntax)JS Output
let coordinates1 = (10, 20, 30);
let (c1x, _, _) = coordinates1;
let coordinates2 = (c1x + 50, 20, 30);

Tips & Tricks

You'd use tuples in handy situations that pass around multiple values without too much ceremony. For example, to return many values:

Reason (Old Syntax)ML (Older Syntax)JS Output
let getCenterCoordinates = () => {
  let x = doSomeOperationsHere();
  let y = doSomeMoreOperationsHere();
  (x, y)
};

Try to keep the usage of tuple local. For data structures that are long-living and passed around often, prefer a record, which has named fields.