关于数学:Haskell中Integer的上界是什么?

What is the upper bound of Integer in Haskell?

我正在解决一个数学问题:想得到数字2^1000的和。

在Java中,解决方案是:

1
2
3
4
5
String temp = BigInteger.ONE.shiftLeft(1000).toString();

int sum = 0;
for (int i = 0; i < temp.length(); i++)
    sum += temp.charAt(i) - '0';

然后在Haskell提出了一个解决方案,如下所示:

1
2
3
digitSum ::(Integral a) => a -> a                  
digitSum 0 = 0
digitSum n = (mod n 10) + (digitSum (div n 10))

整个过程相当流畅,有一点似乎很有趣,我们知道整型不能处理EDCOX1×1,太大了,在Java中,使用EDCOX1×2是很明显的,并且把大数处理成字符串,但是在Haskell中,没有编译错误意味着EDCOX1〔1〕可以直接传递。问题是,Haskell是否在内部将数字转换成字符串?我想确定类型并让编译器确定,然后在ghci中键入以下行:

1
2
3
4
5
6
7
8
9
10
Prelude> let i = 2 ^ 1000

Prelude> i
107150860718626732094842504906000181056140481170553360744375038837035105112493612249319
837881569585812759467291755314682518714528569231404359845775746985748039345677748242309
854210746050623711418779541821530464749835819412673987675591655439460770629145711964776
86542167660429831652624386837205668069376

Prelude> :t i
i :: Integer

在这里,我完全困惑了,很明显,i的数量过大,但i的返回类型仍然是Integer。我们如何解释这一点?哈斯克尔的Integer的上限是多少?


在haskell中,Integer是一种理论上没有边界的整数类型。固定宽度类型有IntInt8Int16Int32Int64和相应的无符号WordWord8等。

在实践中,即使是Integer也会受到可用内存(例如可用内存)或内部表示的约束。

默认情况下,ghc使用gmp包来表示Integer,这意味着绑定是2^(2^37)左右,因为gmp使用32位整数来存储肢体数量。


在haskell中,Integer没有上限;它是一个无边界整数类型。在Haskell中EDCX1的0Ω与Java中的BigInteger相似,而在Java中EDCOX1〔0〕类似于Haskell中的EDCX1〔4〕。haskell中的Int的界限是[-2^63,2^63)。