具有以下功能:
factorial :: Int -> Int
factorial n = product [1..n]
返回参数小于21的正确值。例如:
factorial 20
返回2432902008176640000,但factorial 21
返回-4249290049419214848,即使该值不是负值,也不正确。
我知道应该使用这些大小数字Integer
,但具体是这里发生的错误及其原因?
答案 0 :(得分:5)
Int
是具有有限范围的整数的固定精度表示。与大多数固定精度整数表示的情况一样,算术操作将创建一个太大或太小而无法表示的整数(如Mephy所述,称为整数溢出)将其结果包装,将其截断为最低有效位。例如:
λ> maxBound + 1 :: Int
-9223372036854775808
λ> (maxBound + 1 :: Int) == minBound
True