Haskell中的Floating,Ord和RealFloat

Rob*_*bin 2 haskell typeclass

我试图弄清楚为什么它不能编译

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

但是这个

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

和这个

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

做编译。

我知道Floating和Ord是类型类,但不是Floating的每个成员也是Ord的成员吗?最后,RealFloat只是Floating和Ord的“内部联接”吗?

lef*_*out 5

但是,不是的每个成员Floating也是的成员Ord吗?

明显的反例是复数。此外,某些提供良好Num实例的类型根本不允许进行相等或不相等比较,因为它们表示的不仅仅是单个数字值,而是例如某些数字类型的函数结果的泛型抽象。(这就是为什么它过去Eq不是的超类的原因Num。)

到底,是RealFloat只是一个“内部连接”的FloatingOrd

不过Real,实际上,RealFracRealFloat实际上包含许多非常特定的便捷方法-但我认为您可以仅通过(Floating a, Ord a)约束就可以全部实现它们(尽管效率要低得多)。