Haskell数词
示例
数字类型的最通用类别,更准确地说,是指环,即可以按通常的意义加减乘除而不是除法的数字。
这个类包含两个整型(Int,Integer,Word32等)和部分类型(Double,Rational,也复数等)。在有限类型的情况下,语义通常被理解为模块化算术,即上溢和下溢†。
请注意,与monad或monoid律或相等性比较法相比,数字类的规则要严格遵守得多。特别是,浮点数通常仅在近似意义上服从定律。
方法
fromInteger::Numa=>Integer->a。将整数转换为通用数字类型(必要时环绕范围)。Haskell数字文字可以理解为Integer具有通用转换的单态文字,因此可以5在Int上下文和ComplexDouble设置中使用该文字。
(+)::Numa=>a->a->a。标准加法,通常理解为关联和可交换,即
a+(b+c)≡(a+b)+c
a+b≡b+a
(-)::Numa=>a->a->a。减法,与加法相反:
(a-b)+b≡(a+b)-b≡a
(*)::Numa=>a->a->a。乘法,它是对加法进行分配的关联运算:
a*(b*c)≡(a*b)*c
a*(b+c)≡a*b+a*c
在大多数情况下,乘法也是可交换的,但这绝对不是必需的。
negate::Numa=>a->a。一元求反运算符的全名。-1是的语法糖negate1。
-a≡negatea≡0-a
abs::Numa=>a->a。绝对值函数始终会给出相同幅度的非负结果
abs(-a)≡absa
abs(absa)≡absa
absa≡0应该只在以下情况下发生a≡0。
对于实数类型,很明显非负数是什么意思:总是有absa>=0。复杂等类型没有明确定义的顺序,但是的结果abs应始终位于实子集‡中(即,给出一个也可以写成单个数字文字且不加负的数字)。
signum::Numa=>a->a。根据名称,符号函数仅产生-1或1,具体取决于参数的符号。实际上,这仅适用于非零实数;通常signum更好地理解为归一化函数:
abs(signuma)≡1 --unlessa≡0
signuma*absa≡a--ThisisrequiredtobetrueforallNuminstances
请注意,Haskell2010报告的6.4.4节明确要求此最后一个等式必须适用于任何有效Num实例。
一些库(尤其是线性库和hmatrix库)对Num类的用途有较松散的理解:它们将类视为重载算术运算符的一种方式。尽管对于+和-来说这很简单,但是*使用其他方法已经变得很麻烦。例如,应该*表示矩阵乘法还是逐元素乘法?
定义这样的非数字实例可能是一个坏主意。请考虑专门的课程,如VectorSpace。
†特别是,无符号类型的“负数”被大正数环绕,例如(-4::Word32)==4294967292。
•普遍无法实现:向量类型没有真正的子集。Num这种类型的有争议的实例通常是按元素定义abs和定义的signum,从数学上讲,这实际上没有任何意义。