## Essential Classes

Practical programming in Flix requires knowledge of three type classes: `Eq`, `Order`, and `ToString`.

### The Eq Class

The `Eq` class captures when two values of a specific type are equal:

``````class Eq[a] {

///
/// Returns `true` if and only if `x` is equal to `y`.
///
pub def eq(x: a, y: a): Bool

// ... additional members omitted ...
}
``````

To implement `Eq`, we only have to implement the `eq` function.

### The Order Class

The `Order` class captures when one value is smaller or equal to another value of the same type:

``````class Order[a] with Eq[a] {

///
/// Returns `Comparison.LessThan` if `x` < `y`,
/// `Equal` if `x` == `y` or
/// `Comparison.GreaterThan` if `x` > `y`.
///
pub def compare(x: a, y: a): Comparison

// ... additional members omitted ...
}
``````

To implement the `Order` class, we must implement the `compare` function which returns value of type `Comparison`. The `Comparison` data type is defined as:

``````enum Comparison {
case LessThan
case EqualTo
case GreaterThan
}
``````

### The ToString Class

The `ToString` class is used to obtain a string representation of a specific value:

``````class ToString[a] {
///
/// Returns a string representation of the given `x`.
///
pub def toString(x: a): String
}
``````

Flix uses the `ToString` type class in string interpolations.

For example, the interpolated string

``````"Good morning \${name}, it is \${hour} a clock."
``````

is actually syntactic sugar for the expression:

``````"Good morning " + ToString.toString(name) + ", it is "
+ ToString.toString(hour) + " a clock."
``````

In the following subsection, we discuss how to automatically derive implementations of the `Eq`, `Order`, and `ToString` type classes.