繁体   English   中英

Haskell中的Floating,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是类型类,但并不是每个浮动的成员也是Ord的成员? 最后,RealFloat只是Floating和Ord的“内部联接”吗?

Floating每个成员都不是Ord的成员吗?

显而易见的反例是复数 此外,一些提供良好Num等实例的类型根本不允许相等或不等式比较,因为它们不仅仅表示单个数值,而且例如对某些数字类型的函数结果进行通用抽象。 (这就是为什么Eq不是Num的超类,虽然它曾经是。)

最后, RealFloat只是FloatingOrd的“内部RealFloat ”吗?

虽然RealRealFracRealFloat实际上包含了许多非常具体的便利方法 - 但我认为你可以只用一个(Floating a, Ord a)约束来实现它们(尽管效率低得多(Floating a, Ord a)

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

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

他们都不要求它的论点是Ord实例,所以事实并非如此。 另一方面, RealOrd一个实例, RealFloat也是RealFloat

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM