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 puede usar. Estos subtipos se pueden comparar tanto con otros valores del mismo tipo como con otros subtipos de comparable. Estos subtipos incluyen:
intlogicfloatcharchar32- array si todos los tipos contenidos son subtipos de
comparable - option si todos los tipos contenidos son subtipos de
comparable - tuple si todos los tipos contenidos son subtipos de
comparable - map si todos los tipos contenidos son subtipos de
comparable
Las clases también se pueden convertir en subtipos de comparable con el especificador unique. Las instancias de 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 # Resulta bien
X = Y # Fails
X <> Y # Resulta bien
Actualmente, float, option y classes (independientemente de la presencia de un unique) no se pueden utilizar como claves de mapas, lo que significa que se requiere que las claves de mapa sean un subtipo de comparable que no recibe un nombre (y, por lo tanto, los tipos de clave de mapa no pueden ser tipos paramétricos, ya que los subtipos requeridos no se pueden describir en el código de Verse).
Ten en cuenta que debido a que un valor de un subtipo de comparable se puede comparar con cualquier otro valor de otro subtipo de comparable, pueden ocurrir 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 subtipos.