Тип comparable используется для сравнения значений одного типа с другими значениями того же типа.
Он используется с операторами = и <> для сравнения сигнатур.
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
Каждая из этих функций определена как принимающая первый и второй аргументы произвольного подтипа comparable и возвращающая значение того же типа, что и первый аргумент.
Тип comparable имеет множество подтипов, которые можно использовать. Эти подтипы можно сравнивать как с другими значениями того же типа, так и с другими подтипами comparable. К таким подтипам относятся:
int;logic;floatchar;char32;- array, если все содержащиеся типы являются подтипами
comparable; - option, если все содержащиеся типы являются подтипами
comparable; - tuple, если все содержащиеся типы являются подтипами
comparable; - map, если все содержащиеся типы являются подтипами
comparable.
Классы также можно сделать подтипами comparable с помощью спецификатора unique. Экземпляры классов с таким спецификатором эквивалентны только самим себе, даже если эквивалентны содержащиеся в них члены. Пример:
int_ref := class<unique>:
Contents:int
Main()<decides> : void =
X := int_ref{Contents := 0}
Y := int_ref{Contents := 0}
X = X # Выполнение
X = Y # Невыполнение
X <> Y # Выполнение
В настоящее время типы float, option, а также классы (независимо от наличия у них спецификатора unique) не могут использоваться в качестве ключей ассоциативных массивов (map). Ключи ассоциативных массивов должны иметь подтип comparable без присвоенного имени. (По этой причине у ассоциативных массивов не может быть параметрических ключей, так как в коде Verse невозможно описать необходимые подтипы.)
Обратите внимание, что, поскольку значение подтипа comparable может сравниваться с любым другим значением другого подтипа comparable, возможны неожиданные результаты. Пример:
0 = 0.0
Этот пример не выдаст результата, потому что 0 имеет тип int, тогда как 0.0 имеет тип float, а int и float не являются подтипами.