Compare

type Comparable = class
    def (>) (rhs : Self) : bool
    def (<) (rhs : Self) : bool
    def (>=) (rhs : Self) : bool
    def (<=) (rhs : Self) : bool

Класс является контрактом. Он не существует во время выполнения, используется в качестве ограничения для параметров обобщённых типов.

Self указывает на конкретный тип, для которого вызывается метод.

type Char
    def (>) @c (rhs : Char) : bool
    def (<) @c (rhs : Char) : bool
    def (>=) @c (rhs : Char) : bool
    def (<=) @c (rhs : Char) : bool
    
    is Comparable

Для типа Char заданы все четыре необходимых метода, поэтому он может быть объявлен принадлежащим к классу Comparable.

Атрибут @c означает, что метод представляет существующую функцию на языке Си, в нашем случае это поддерживаемый языком оператор.

type Compare = class
    def compare (other : Self) : Ordering

    def (>) (rhs : Self) =
        let result = compare rhs
        result == Ordering/Greater

    def (>=) (rhs : Self) =
        let result = compare rhs
        result <> Ordering/Less

    def (<) (rhs : Self) =
        let result = compare rhs
        result == Ordering/Less

    def (<=) (rhs : Self) =
        let result = compare rhs
        result <> Ordering/Greater

    is Comparable

Класс Compare предоставляет операторы сравнения взамен реализации единственного метода compare.

type (T1, T2) u v where T1 : Comparable
                        T2 : Comparable
    def compare (other : Self) = when
        u > other.u -> Ordering/Greater
        u < other.u -> Ordering/Less
        v > other.v -> Ordering/Greater
        v < other.v -> Ordering/Less
        else -> Ordering/Equal

    is Compare

Мы расширяем кортеж из двух элементов T1 и T2, принадлежащих к классу Comparable. Внутри методов элементы доступны под именами u и v. В итоге кортеж принадлежит как к классу Compare, так и к Comparable.