# StaticTyping

#### Synopsis

The static type system of Rascal.

#### Description

Rascal is based on static typing, this means that as many errors and inconsistencies as possible are spotted before the program is executed.

## The Type Lattice

The types are ordered in a so-called *type lattice* shown in the following figure.

The arrows describe a *subtype-of* relation between types. The type `void`

is the *smallest* type and
is included in all other types and the type `value`

is the *largest* type that includes all other types.
We also see that `rel`

is a subtype of `set`

and that each ADT is a subtype of `node`

.
A special role is played by the datatype `Tree`

that is the generic type of syntax trees.
Syntax trees for specific languages are all subtypes of `Tree`

. As a result, syntax trees can be addressed at two levels:

- in a generic fashion as
`Tree`

and, - in a specific fashion as a more precisely typed syntax tree.
Finally, each
`alias`

is structurally equivalent to one or more specific other types.

The fact that the types are ordered in a lattice makes it possible to define a *Least Upper Bound* (lub) on types.
Given two types *T*₁ and *T*₂, `lub(T₁, T₂)`

is defined as the nearest common super type of *T*₁ and *T*₂
in the type lattice.

## Advanced Features

The Rascal type system has various advanced features that are described separately:

- Types may be be
*parameterized*resulting in very general and reusable types, see Type Parameters. - Declarations of Functions and Algebraic Data Types may be parameterized and Type Constraints can be used to define constraints on the actual type to be used.
- The formal arguments of functions are bound to
*values*but in exceptional cases a function may need a type as argument value, ReifiedTypes make this possible.

#### Examples

Here are some simple examples of correct and incorrect typing:

We can assign an integer value to an integer variable:

`rascal>int i = 3;`

int: 3

But assigning a string value gives an error:

`rascal>int j = "abc";`

|prompt:///|(4,9,<1,4>,<1,13>): Expected int, but got str

Advice: |https://www.rascal-mpl.org/docs/Rascal/Errors/CompileTimeErrors/UnexpectedType|

ok

The `num`

type accepts integer and real values:

`rascal>num n = i;`

num: 3

rascal>n = 3.14;

num: 3.14

A variable of type `value`

accepts all possible values:

`rascal>value v = true;`

value: true

rascal>v = "abc";

value: "abc"

rascal>v = [1, 2, 3];

value: [1,2,3]