Haskell 中数字的解释

Explanation of numbers in Haskell

我想要一个清楚的解释 Num, Real, Integral, Integer, Int, Ratio, Rational, Double, Float.

这个答案主要假定您知道类型和类型 classes 之间的区别。如果您不清楚这种差异,那么在继续阅读之前 clear up your understanding

数量

Num 是一个类型class,包括所有数字类型。

:info Num
class Num a where
  (+) :: a -> a -> a
  (-) :: a -> a -> a
  (*) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a
        -- Defined in ‘GHC.Num’
instance Num Word -- Defined in ‘GHC.Num’
instance Num Integer -- Defined in ‘GHC.Num’
instance Num Int -- Defined in ‘GHC.Num’
instance Num Float -- Defined in ‘GHC.Float’
instance Num Double -- Defined in ‘GHC.Float’

真实

也是一个类型class,涵盖那些可以表示为实数值的类型(Rational 类型)。

:info Real
class (Num a, Ord a) => Real a where
  toRational :: a -> Rational
        -- Defined in ‘GHC.Real’
instance Real Word -- Defined in ‘GHC.Real’
instance Real Integer -- Defined in ‘GHC.Real’
instance Real Int -- Defined in ‘GHC.Real’
instance Real Float -- Defined in ‘GHC.Float’
instance Real Double -- Defined in ‘GHC.Float’

积分

积分类型class,你知道,...,-2,-1,0,1,...。 Integer(又名 big int)、Int、Int64 等类型是实例。

:info Integral
class (Real a, Enum a) => Integral a where
  quot :: a -> a -> a
  rem :: a -> a -> a
  div :: a -> a -> a
  mod :: a -> a -> a
  quotRem :: a -> a -> (a, a)
  divMod :: a -> a -> (a, a)
  toInteger :: a -> Integer
        -- Defined in ‘GHC.Real’
instance Integral Word -- Defined in ‘GHC.Real’
instance Integral Integer -- Defined in ‘GHC.Real’
instance Integral Int -- Defined in ‘GHC.Real’

整数

一种类型,而不是我们到现在为止讨论过的那种类型 class,它可以表示无界整数。所以 2^3028 是合法值。

整数

一个固定宽度的积分。在 GHC 编译器中,这是 32 位或 64 位,具体取决于您的体系结构。 Haskell 语言只保证这至少是 29 位。

比率

这是一个类型构造函数,因此您可以说类似 Ratio Integer 的内容来获取两个整数比率的类型(数学上 a/b)。

理性

好吧,有理数实际上是两个整数的比率,理解比率就很好:

:i Rational
type Rational = Ratio Integer

双人

一种双精度浮点值类型。

浮动

单精度浮点值类型。

Haskell documentation 中有一张有趣的图片显示了 类 和它们的类型实例之间的关系,涵盖了你提到的大部分:

关于Rational numbers

For each Integral type t, there is a type Ratio t of rational pairs with components of type t. The type name Rational is a synonym for Ratio Integer.