對於數字型別,更精確地為最通用的類 ,即數字可以相加和相減,再乘以通常意義上的,但並不一定分歧。

該類包含整數型別(IntIntegerWord32 等)和分數型別(DoubleRational,也是複數等)。在有限型別的情況下,語義通常被理解為模運算,即具有上溢和下溢

請注意,數字類的規則嚴格遵守 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。一元否定運算子的全名。-1negate 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 函式只產生 -11,具體取決於引數的符號。實際上,這隻適用於非零實數; 一般來說 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-例項通常定義了 abssignum 元素,從數學角度講它們並不真正有意義。