Typ comparable jest używany do porównywania wartości tego typu z innymi wartościami tego samego typu.
Operatory = i <> używają tego typu do definiowania swoich sygnatur.
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
Każda z tych funkcji jest zdefiniowana jako przyjmująca pierwszy argument, który jest arbitralnym podtypem comparable, oraz drugi argument, który również jest arbitralnym podtypem i który zwraca ten sam typ, co pierwszy argument.
Typ comparable ma wiele podtypów, których można używać. Te podtypy można porównywać zarówno z innymi wartościami tego samego typu, jak i z innymi podtypami comparable. Te podtypy to:
intlogicfloatcharchar32- tablica (array), jeśli wszystkie zawarte w niej typy są podtypami
comparable - opcja (option), jeśli wszystkie zawarte w niej typy są podtypami
comparable - krotka (tuple), jeśli wszystkie zawarte w niej typy są podtypami
comparable - mapa (map), jeśli wszystkie zawarte w niej typy są podtypami
comparable
Za pomocą specyfikatora unique można również nadawać klasom status podtypów comparable. Instancje klas z tym specyfikatorem są równe tylko sobie, nawet jeśli zawarte w nich człony są równe. Na przykład:
int_ref := class<unique>:
Contents:int
Main()<decides> : void =
X := int_ref{Contents := 0}
Y := int_ref{Contents := 0}
X = X # Kończy się powodzeniem
X = Y # Kończy się niepowodzeniem
X <> Y # Kończy się powodzeniem
Obecnie float, option i klasy (niezależnie od obecności specyfikatora unique) nie mogą być używane jako klucze map, co oznacza, że klucze map muszą być podtypem comparable, któremu nie nadano nazwy (i dlatego typy kluczy map nie mogą być typami parametrycznymi, ponieważ wymaganej struktury podtypów nie da się opisać w kodzie Verse).
Należy pamiętać, że ponieważ wartość podtypu comparable może być porównywana z dowolną inną wartością innego podtypu comparable, mogą wystąpić pewne nieoczekiwane rezultaty. Na przykład:
0 = 0.0
Ten przykład zakończy się niepowodzeniem, ponieważ 0 jest typu int, podczas gdy 0.0 jest typu float, a int i float nie mają wspólnej relacji podtypów.