我试图了解Haskell中的numeric type class层次结构。基本数字类型是
class Num a where
...
请注意,根据我的一些消息(幻灯片),实际上应该是
class Eq a => Num a where
...
但我无法在序曲中找到它。
现在,我对Real
类型的类感兴趣
class (Num a, Ord a) => Real a where
-- the rational equivalent of its real argument with full precision
toRational :: a -> Rational
我猜想Real
是指这样的事实:作为Real
实例的类型并不复杂。但是我从数学上对Real
的理解是,它可以是 Rational 和 Irrational ,因此对于所有{他们。当然,非理性数字也不能在计算机中使用...
谢谢!
答案 0 :(得分:7)
是的,名称Real
对于可以转换为有理数类型的类型来说是一个相当误导的名称。
实际上,我们有Real Integer
,Real IntPtr
,Real CBool
之类的实例,这非常令人惊讶。
标准数字类在名称和总体设计上都被认为有点怪异。
答案 1 :(得分:4)
通常,Haskell的数字类有点混乱。它们的定义方式使使用Int
,Integer
,Double
等基本数字类型变得方便,容易。但是当您开始需要更高级的数字时...他们并不总是很有意义。
关于Num
:这很有趣。 Haskell '98和Haskell 2010报告均要求
class (Eq a, Show a) => Num a
如果您查看base-4.0.0.0
的文档,就会发现是这种情况:
http://hackage.haskell.org/package/base-4.0.0.0/docs/Prelude.html#7
但是,在某些时候base
包已更改,使得Num
现在没有超类(与报告相反)。因此,您的幻灯片没错; 使用就是这样定义的,但是在某些时候它发生了变化。如果您深入研究,可能会有关于此的票证或维基页面。
关于Real
...是的,该名称具有误导性。我也不太确定为什么它与RealFrac
不同,为什么 也涉及从数字到各种比率或整数的转换。
如果您对这种东西感兴趣,那么这里有各种各样的“另类序曲”库(例如“经典序曲”,“数字序曲”),它们希望用更合理的方法代替标准的序曲。事实证明,要做到这一点真的很难,这就是令人惊讶的事情-这就是为什么官方规格没有真正改变的原因。没有人提出更好的结论。