民
對於數字型別,更精確地為最通用的類環 ,即數字可以相加和相減,再乘以通常意義上的,但並不一定分歧。
該類包含整數型別(Int
,Integer
,Word32
等)和分數型別(Double
,Rational
,也是複數等)。在有限型別的情況下,語義通常被理解為模運算,即具有上溢和下溢 † 。
請注意,數字類的規則嚴格遵守 monad 或 monoid 定律或等同比較的規則 。特別是,浮點數通常僅在近似意義上遵守法則。
方法
-
fromInteger::Num a => Integer -> a
。將整數轉換為常規數字型別(如果需要,包圍範圍)。Haskell 數字文字可以理解為單形Integer
文字,並且圍繞它進行一般轉換,因此你可以在Int
上下文和Complex Double
設定中使用文字5
。 -
(+) :: 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
。根據名稱,sign 函式只產生-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
元素,從數學角度講它們並不真正有意義。