Являются ли Ord и Enum иногда несовместимыми в Haskell?
мог бы Ord
и Enum
один typeclass? Почему не Enum
require Eq
?
3 ответов
Enum
представляет типы, которые могут быть сопоставлены с числами. Это ничего не говорит о том, как эти типы должны быть отсортированы, просто вы можете представить их целыми числами.
Ord
представляет упорядоченные типы. Это отличается от типов, которые могут быть сопоставлены с числами. Например, вы не можете сопоставить значения с плавающей запятой произвольной точности с целыми числами, но вы can заказать их. И хотя вы технически можете попытаться сопоставить поплавки с целыми числами, никто в здравом уме они бы так и сделали.
по состоянию на Eq
, Ord
требует этого, потому что нет смысла иметь полностью упорядоченный тип данных, который не поддерживает равенство. Однако,Enum
не нужен Eq
. С Enum
не предоставляет никаких гарантий заказа, он также не предоставляет гарантий равенства.
есть вещи, которые можно перечислять без порядка. Например:
data Color = Red | Green | Blue deriving Enum
какие цвета есть? Нет никакого внутреннего порядка, даже если цвета могут быть enuemrated.
есть также вещи, которые можно перечислить, но не сравнить для равенства. Поплавки, например, имеют значение NaN, которое не равно ничему. Однако поплавки можно перечислить.
хотя я не уверен, в какой степени это принято, но я всегда смотрел Enum
как класс типов, описывающий типы с canonical общая предзаказов (т. е. может быть цикл) такой, что последовательность членов "между" любой парой членов конечна (засвидетельствована enumFromTo
).
Ord
, С другой стороны, описывает типы с canonical общая сумма заказов без какого-либо требования, что набор элементов между любой парой терминов быть конечный.