为什么大数字操作在Haskell中使用'int'在某一点返回负数?

Gra*_*ant 1 int haskell numbers

具有以下功能:
factorial :: Int -> Int
factorial n = product [1..n]

参数小于21时返回正确的值.例如: factorial 20返回2432902008176640000,但factorial 21返回-4249290049419214848即使值不为负,也不正确.

我知道应该使用这些大小的数字Integer,但具体是这里发生的错误,为什么?

Rei*_*chs 5

Int在Haskell中是具有有限范围的整数的固定精度表示.与大多数固定精度整数表示的情况一样,将创建一个太大或太小而无法表示的整数的算术运算(如Mephy所述,称为整数溢出)将通过截断它来包装其结果到它最不重要的位.例如:

?> maxBound + 1 :: Int
-9223372036854775808

?> (maxBound + 1 :: Int) == minBound
True
Run Code Online (Sandbox Code Playgroud)