next: Bottom / Error

## Type Hierarchy

CUE defines the following type hierarchy

  null  bool  string  bytes  number  struct  list
/   \
int  float


In addition, CUE defines the values bottom, or error, (denoted _|_) that is an instance of all types and top, or any, (denoted _) of which all types are an instance.

Note how we use the terms types and values interchangeably. CUE does not distinguish between types and values. The term “type” merely refers to the kind of a value, which may or may not be a concrete instance.

In the example, point defines an arbitrary point, while xaxis and yaxis define the points on the respective lines. We say that point, xaxis, and yaxis are incomplete, as they do not specify a specific point. Incomplete values cannot be represented as JSON, as it can only represent concrete values.

The only concrete point is origin. The origin is defined to be both on the x-axis and y-axis, which means it must be at 0, 0. Here we see constraints in action: origin evalutes to 0, 0, even though we did not specify its coordinates explicitly.

types.cue

point: {
x: number
y: number
}

xaxis: point
xaxis: x: 0

yaxis: point
yaxis: y: 0

origin: xaxis & yaxis

\$ cue eval types.cue

point: {
x: number
y: number
}
xaxis: {
x: 0
y: number
}
yaxis: {
x: number
y: 0
}
origin: {
x: 0
y: 0
}