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
.