Haskell中的数字说明

Afo*_*tos 11 haskell types numbers typeclass

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

Tho*_*son 15

这个答案主要假设你知道类型和类型类之间的区别.如果这种差异对你来说是朦胧的,那么在阅读之前要清楚你的理解.

Num 是一个包含所有数字类型的类型类.

: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’
Run Code Online (Sandbox Code Playgroud)

真实

还有一个类型类,涵盖那些可以表示为实际值(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’
Run Code Online (Sandbox Code Playgroud)

积分

你知道,积分的类型类...,-2,-1,0,1,....诸如Integer(aka 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’
Run Code Online (Sandbox Code Playgroud)

整数

一个类型,而不是类型类,比如我们到目前为止所讨论的类型,它可以表示无界的整数.这2^3028是一个合法的价值.

诠释

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

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

合理的

那么理性就是两个整数的比例,理解比例并且你很好:

:i Rational
type Rational = Ratio Integer
Run Code Online (Sandbox Code Playgroud)

双精度浮点值的类型.

浮动

单精度浮点值的类型.

  • `Ratio` 是具有 *any* 数字类型的两个值的比率。`Rational` 是两个*任意精度*整数的比率。 (2认同)

Hel*_*ira 6

维基教科书中有一个有趣的图像,显​​示了类及其类型实例之间的关系,涵盖了您提到的大部分内容:

对于有理数Ratio只是用 构造的一对值:%,对值没有任何类型限制,甚至String允许 s,但一些有用的函数和类型类仅为Ratios定义Integral。并且Rational只是 aRatioIntegers。

data Ratio a = !a :% !a
type Rational = Ratio Integer
Run Code Online (Sandbox Code Playgroud)

  • 该图像已过时,但足以用于此讨论。为了澄清起见,Functor 的层次结构现在是 `Functor => Applicative => Monad` 和 `Applicative => Alternative` 和 `Monad => MonadPlus`,尽管这里没有讨论这一点 (3认同)