Haskell 中的浮动、Ord 和 RealFloat

Floating, Ord and RealFloat in 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 的 "inner join" 吗?

but isn't every member of Floating also a member of Ord?

明显的反例是complex numbers。此外,某些提供良好 Num 等实例的类型根本不允许进行相等或不等比较,因为它们代表的不仅仅是一个数值,例如 某些数字类型 的函数结果的通用抽象。 (这就是为什么 Eq 不是 Num 的超类,尽管它曾经是。)

in the end, is RealFloat just a "inner join" of Floating and Ord?

差不多,虽然 RealRealFracRealFloat 实际上包含很多非常具体的便利方法——但我认为你可以实现它们(尽管效率低得多)只有 (Floating a, Ord a) 约束。

让我们看看 Floating 类型类的定义。我认为它只是被定义为保证可以使用以下功能的东西:

pi, exp, log, sin, cos, asin, acos, atan, sinh, cosh, asinh, acosh, atanh

其中

None 要求它的参数是 Ord 的实例,所以它不是。另一方面,RealOrd 的实例,RealFloat.

也是