Le type comparable est utilisé pour comparer les valeurs de ce type à d'autres valeurs du même type.
Les opérateurs = et <> utilisent ce type pour définir leurs signatures.
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
Chacune de ces fonctions est définie comme prenant un premier argument qui est un sous-type arbitraire de comparable et un second argument qui est aussi un sous-type arbitraire, et qui renvoie le même type que le premier argument.
Le type comparable possède de nombreux sous-types que vous pouvez utiliser. Ces sous-types peuvent être comparés à la fois avec d'autres valeurs du même type de type, et d'autres sous-types de comparable. Ces sous-types incluent :
intlogicfloatcharchar32- matrice si tous les types contenus sont des sous-types de
comparable - option si tous les types contenus sont des sous-types de
comparable - tuple si tous les types contenus sont des sous-types de
comparable - map si tous les types contenus sont des sous-types de
comparable
Il est également possible de faire des classes des sous-types de comparable avec le spécificateur unique. Les instances de classes avec ce spécificateur sont seulement égales à elles-mêmes, même si les membres contenus sont égaux. Par exemple :
int_ref := class<unique>:
Contents:int
Main()<decides> : void =
X := int_ref{Contents := 0}
Y := int_ref{Contents := 0}
X = X # Réussite
X = Y # Échec
X <> Y # Réussite
Actuellement, float, option et les classes (indépendamment de la présence de "unique") ne peuvent pas être utilisées comme clés de cartes, ce qui signifie que les clés de carte doivent être un sous-type de comparable auquel on ne donne pas de nom (et donc, les types de clés de carte ne peuvent pas être des types paramétriques, car le sous-typage requis ne peut pas être décrit dans le code Verse).
Notez que parce qu'une valeur d'un sous-type de comparable peut être comparée à n'importe quelle autre valeur d'un autre sous-type de comparable, certains résultats inattendus peuvent se produire. Par exemple :
0 = 0.0
Cet exemple sera un échec, car 0 est de type int, alors que 0.0 est de type float, et int et float ne partagent pas de relation de sous-typage.