Haskell数词

示例

数字类型的最通用类别,更准确地说,是指环,即可以按通常的意义加减乘除而不是除法的数字。

这个类包含两个整型(Int,Integer,Word32等)和部分类型(Double,Rational,也复数等)。在有限类型的情况下,语义通常被理解为模块化算术,即上溢和下溢

请注意,与monad或monoid律或相等性比较法相比,数字类的规则要严格遵守得多。特别是,浮点数通常仅在近似意义上服从定律。

方法

  • fromInteger :: Num a => Integer -> a。将整数转换为通用数字类型(必要时环绕范围)。Haskell数字文字可以理解为Integer具有通用转换的单态文字,因此可以5在Int上下文和Complex Double设置中使用该文字。

  • (+) :: Num a => a -> a -> a。标准加法,通常理解为关联和可交换,即

      a + (b + c) ≡ (a + b) + c
     a + b ≡ b + a
  • (-) :: Num a => a -> a -> a。减法,与加法相反:

      (a - b) + b ≡ (a + b) - b ≡ a
  • (*) :: Num a => a -> a -> a。乘法,它是对加法进行分配的关联运算:

      a * (b * c) ≡ (a * b) * c
     a * (b + c) ≡ a * b + a * c

    在大多数情况下,乘法也是可交换的,但这绝对不是必需的。

  • negate :: Num a => a -> a。一元求反运算符的全名。-1是的语法糖negate 1。

      -a ≡ negate a ≡ 0 - a
  • abs :: Num a => a -> a。绝对值函数始终会给出相同幅度的非负结果

      abs (-a) ≡ abs a
     abs (abs a) ≡ abs a

    abs a ≡ 0应该只在以下情况下发生a ≡ 0。

    对于实数类型,很明显非负数是什么意思:总是有abs a >= 0。复杂等类型没有明确定义的顺序,但是的结果abs应始终位于实子集‡中(即,给出一个也可以写成单个数字文字且不加负的数字)。

  • signum :: Num a => a -> a。根据名称,符号函数仅产生-1或1,具体取决于参数的符号。实际上,这仅适用于非零实数;通常signum更好地理解为归一化函数:

      abs (signum a) ≡ 1   -- unless a≡0
     signum a * abs a ≡ a -- This is required to be true for all Num instances

    请注意,Haskell 2010报告的6.4.4节明确要求此最后一个等式必须适用于任何有效Num实例。


一些库(尤其是线性库和hmatrix库)对Num类的用途有较松散的理解:它们将类视为重载算术运算符的一种方式。尽管对于+和-来说这很简单,但是*使用其他方法已经变得很麻烦。例如,应该*表示矩阵乘法还是逐元素乘法?
定义这样的非数字实例可能是一个坏主意。请考虑专门的课程,如VectorSpace。


特别是,无符号类型的“负数”被大正数环绕,例如(-4 :: Word32) == 4294967292。

普遍无法实现:向量类型没有真正的子集。Num这种类型的有争议的实例通常是按元素定义abs和定义的signum,从数学上讲,这实际上没有任何意义。