Я тут начал изучать Haskell, и у меня возник такой вопрос. Как известно, тип Double имеет, в числе прочих, значения NaN (нечисла). Их можно получить как 0/0 или как read «NaN» :: Double. В соответствии с арифметикой IEEE 754, значения NaN не сравнимы и не равны никаким значениям, даже себе (т.е. любое сравнение NaN, кроме /=, возвращает False). Это можно легко проверить напрямую:
Prelude> let a = 0/0
Prelude> a == a
False
Как такое поведение согласуется с тем, что Double относится к тайпклассам Ord и Eq?
Проблема может быть в том, что функции, использующие инстансы Ord, ожидают, что из сравнений a<b, a>b, a==b хотя бы одно верно, а использование инстансов Eq неявно подразумевает, что значения должны быть равны самим себе. Для NaN эти свойства не выполняются.