El tipo comparable se utiliza para comparar valores de este tipo con otros valores del mismo tipo.
Los operadores = y <> hacen uso de este tipo para definir sus firmas.
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
Cada una de estas funciones se define tomando un primer argumento que es un subtipo arbitrario de comparable y un segundo argumento que también es un subtipo arbitrario, y que devuelve el mismo tipo que el primer argumento.
El tipo comparable tiene muchos subtipos que puedes utilizar. Estos subtipos pueden compararse tanto con otros valores del mismo tipo como con otros subtipos de comparable. Estos subtipos incluyen:
intlogicfloatcharchar32arraysi todos los tipos contenidos son subtipos decomparable.optionsi todos los tipos contenidos son subtipos decomparable.tuplesi todos los tipos contenidos son subtipos decomparable.mapsi todos los tipos contenidos son subtipos decomparable.
Las clases también pueden convertirse en subtipos de comparable con el especificador unique. Las instancias de las clases con este especificador solo son iguales a sí mismas, incluso si los miembros contenidos son iguales. Por ejemplo:
int_ref := class<unique>:
Contents:int
Main()<decides> : void =
X := int_ref{Contents := 0}
Y := int_ref{Contents := 0}
X = X # Tiene éxito
X = Y # Falla
X <> Y # Tiene éxito
Actualmente, float, option y classes (independientemente de la presencia de unique) no pueden utilizarse como claves de map, lo que significa que las claves de map deben ser un subtipo de comparable al que no se le da un nombre (y, por tanto, los tipos de claves de map no pueden ser tipos paramétricos, ya que la subtipificación requerida no puede describirse en el código Verse).
Ten en cuenta que como un valor de un subtipo de comparable puede compararse con cualquier otro valor de otro subtipo de comparable, pueden producirse algunos resultados inesperados. Por ejemplo:
0 = 0.0
Este ejemplo fallará porque 0 es de tipo int, mientras que 0.0 es de tipo float, e int y float no comparten una relación de subtipificación.