Floating, Ord и RealFloat в Haskell

Я пытаюсь понять, почему это не компилируется

yell :: (Floating a) => a -> [Char]
yell x
    | x > 10.0 = "Yelling"
    | otherwise = "No Yell"

но это

yell :: (Floating a, Ord a) => a -> [Char]
yell x
    | x > 10.0 = "Yelling"
    | otherwise = "No Yell"

и это

yell :: (RealFloat a) => a -> [Char]
yell x
    | x > 10.0 = "Yelling"
    | otherwise = "No Yell"

компилировать.

Я знаю, что Floating и Ord являются классами типов, но разве не каждый член Floating также является членом Ord? И в конце концов, является ли RealFloat просто «внутренним соединением» Floating и Ord?


person Robin    schedule 03.05.2015    source источник
comment
Плавающая точка и равенство - не совсем приятели.   -  person Shoe    schedule 03.05.2015


Ответы (2)


но разве не каждый член Floating также является членом Ord?

Очевидный контрпример - комплексные числа. Кроме того, некоторые типы, которые дают хорошие Num и т. Д. Экземпляры, вообще не допускают сравнения на равенство или неравенство, потому что они представляют больше, чем просто одно числовое значение, но, например, общая абстракция над результатами функции некоторого числового типа. (Вот почему Eq не является суперклассом Num, хотя раньше был.)

в конце концов, является ли RealFloat просто "внутренним соединением" Floating и Ord?

В значительной степени, хотя Real, RealFrac и RealFloat на самом деле содержат множество очень специфических удобных методов, но я думаю, вы могли бы реализовать их все (хотя и гораздо менее эффективно) с помощью всего лишь ограничения (Floating a, Ord a).

person leftaroundabout    schedule 03.05.2015

Давайте посмотрим определение класса типов Floating. Я думаю, что это просто определено как что-то, что гарантирует, что с ним могут использоваться следующие функции:

пи, ехр, журнал, грех, cos, asin, acos, atan, sinh, cosh, asinh, acosh, atanh

Ни один из них не требует, чтобы его аргумент был экземпляром Ord, поэтому это не так. С другой стороны, Real является экземпляр Ord и RealFloat.

person Mark Karpov    schedule 03.05.2015