Haskell类型类“ Real”是否用词不当?

时间:2018-09-20 09:38:18

标签: haskell types typeclass

我试图了解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 ,因此对于所有{他们。当然,非理性数字也不能在计算机中使用...

谢谢!

2 个答案:

答案 0 :(得分:7)

是的,名称Real对于可以转换为有理数类型的类型来说是一个相当误导的名称。

实际上,我们有Real IntegerReal IntPtrReal CBool之类的实例,这非常令人惊讶。

标准数字类在名称和总体设计上都被认为有点怪异。

答案 1 :(得分:4)

通常,Haskell的数字类有点混乱。它们的定义方式使使用IntIntegerDouble等基本数字类型变得方便,容易。但是当您开始需要更高级的数字时...他们并不总是很有意义。


关于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不同,为什么 也涉及从数字到各种比率或整数的转换。


如果您对这种东西感兴趣,那么这里有各种各样的“另类序曲”库(例如“经典序曲”,“数字序曲”),它们希望用更合理的方法代替标准的序曲。事实证明,要做到这一点真的很难,这就是令人惊讶的事情-这就是为什么官方规格没有真正改变的原因。没有人提出更好的结论。