O tipo comparable é usado para comparar valores deste tipo com outros valores do mesmo tipo.
O = e <> operadores usam este tipo para definir suas assinaturas.
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
Cada uma dessas funções é definida como a tomada de um primeiro argumento que é um subtipo arbitrário de comparable e um segundo argumento que também é um subtipo arbitrário, que retorna o mesmo tipo que o primeiro argumento.
O tipo comparable tem vários subtipos que podem ser usados. Esses subtipos podem ser comparados com outros valores do mesmo tipo, bem como outros subtipos de comparable. Os subtipos incluem:
intlogicfloatcharchar32- matriz se todos os tipos contidos forem subtipos de
comparable - opção se todos os tipos contidos forem subtipos de
comparable - tupla se todos os tipos contidos forem subtipos de
comparable - mapa se todos os tipos contidos forem subtipos de
comparable
Classes também podem ser subtipos de comparable com o especificador unique. Instâncias de classes com este especificador são iguais apenas a si, mesmo se os membros contidos forem iguais. Por exemplo:
~~~(verse)
int_ref := class
Main()
Atualmente, float, option e classes (independentemente da presença de unique) não podem ser usadas como chaves de mapas, ou seja, chaves de mapas precisam ser um subtipo de comparable que não recebe nome (por isso, tipos de chave de mapa não podem ser tipos paramétricos, pois não é possível descrever subtipos no código Verse).
Observe que podem ocorrer alguns resultados inesperados, porque o valor de um subtipo de comparable pode ser comparado com qualquer outro valor de outro subtipo de comparable. Por exemplo:
~~~(verse) 0 = 0.0 ~~~
Este exemplo irá falhar, porque 0 é do tipo int, enquanto 0.0 é do tipo float, e int e float não compartilham um relacionamento de subtipo.