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 中有一张有趣的图片显示了 类 和它们的类型实例之间的关系,涵盖了你提到的大部分:
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
.
我想要一个清楚的解释 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 中有一张有趣的图片显示了 类 和它们的类型实例之间的关系,涵盖了你提到的大部分:
For each
Integral
type t, there is a typeRatio
t of rational pairs with components of type t. The type nameRational
is a synonym forRatio Integer
.