Il tipo comparable viene utilizzato per confrontare valori di questo tipo con altri valori dello stesso tipo.
Gli operatori = e <> utilizzano questo tipo per definire le proprie firme.
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
Ognuna di queste funzioni è definita come funzione che prende un primo argomento che è un sottotipo arbitrario di comparable e un secondo argomento che è a sua volta un sottotipo arbitrario e che restituisce lo stesso tipo del primo argomento.
Il tipo comparable ha molti sottotipi che si possono utilizzare. Questi sottotipi si possono confrontare sia con altri valori dello stesso tipo di tipo, sia con altri sottotipi di comparable. Questi sottotipi includono:
intlogicfloatcharchar32- array se tutti i tipi contenuti sono sottotipi di
comparable - opzione se tutti i tipi contenuti sono sottotipi di
comparable - tupla se tutti i tipi contenuti sono sottotipi di
comparable - mappa se tutti i tipi contenuti sono sottotipi di
comparable
Le classi si possono anche trasformare in sottotipi di comparable con lo specificatore unique. Le istanze di classi con questo specificatore sono uguali solo a se stesse, anche se i membri contenuti sono uguali. Ad esempio:
int_ref := class<unique>:
Contents:int
Main()<decides> : void =
X := int_ref{Contents := 0}
Y := int_ref{Contents := 0}
X = X # Succeeds
X = Y # Fails
X <> Y # Succeeds
Attualmente float, option e classes (indipendentemente dalla presenza di elementi univoci) non si possono utilizzare come chiavi mappa, il che significa che le chiavi mappa devono essere un sottotipo di comparable a cui non viene dato un nome (e quindi, i tipi di chiave mappa non possono essere tipi parametrici, poiché la sottotipizzazione richiesta non può essere descritta nel codice Verse).
Nota: poiché un valore di un sottotipo di comparable si può confrontare con qualsiasi altro valore di un altro sottotipo di comparable, possono verificarsi alcuni risultati imprevisti. Ad esempio:
0 = 0.0
Questo esempio avrà esito negativo poiché 0 è di tipo int, mentre 0.0 è di tipo float e int e float non condividono una relazione di sottotipizzazione.