Являются ли 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 общая сумма заказов без какого-либо требования, что набор элементов между любой парой терминов быть конечный.