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
?
差不多,虽然 Real
、RealFrac
和 RealFloat
实际上包含很多非常具体的便利方法——但我认为你可以实现它们(尽管效率低得多)只有 (Floating a, Ord a)
约束。
让我们看看 Floating
类型类的定义。我认为它只是被定义为保证可以使用以下功能的东西:
pi, exp, log, sin, cos, asin, acos, atan, sinh, cosh, asinh, acosh, atanh
其中 None 要求它的参数是 Ord
的实例,所以它不是。另一方面,Real
是 Ord
的实例,RealFloat
.
也是
我想弄清楚为什么这不能编译
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 ofOrd
?
明显的反例是complex numbers。此外,某些提供良好 Num
等实例的类型根本不允许进行相等或不等比较,因为它们代表的不仅仅是一个数值,例如 某些数字类型 的函数结果的通用抽象。 (这就是为什么 Eq
不是 Num
的超类,尽管它曾经是。)
in the end, is
RealFloat
just a "inner join" ofFloating
andOrd
?
差不多,虽然 Real
、RealFrac
和 RealFloat
实际上包含很多非常具体的便利方法——但我认为你可以实现它们(尽管效率低得多)只有 (Floating a, Ord a)
约束。
让我们看看 Floating
类型类的定义。我认为它只是被定义为保证可以使用以下功能的东西:
其中pi, exp, log, sin, cos, asin, acos, atan, sinh, cosh, asinh, acosh, atanh
None 要求它的参数是 Ord
的实例,所以它不是。另一方面,Real
是 Ord
的实例,RealFloat
.