繁体   English   中英

Haskell中Integer的上限是多少?

[英]What is the upper bound of Integer in Haskell?

我正在解决一个数学问题:想要获取数字2^1000的数字总和。

在Java中,解决方案类似于:

String temp = BigInteger.ONE.shiftLeft(1000).toString();

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

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

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

整个过程非常顺利,有一点似乎很有趣,我们知道整数类型不能处理2 ^ 1000 ,太大了,在Java中,使用BigInteger并将大数字处理为字符串是显而易见的,但是在Haskell中,没有编译错误意味着2 ^ 1000可以直接传递。 这是问题,Haskell是否在内部将数字转换为字符串? 我想确定类型是什么,然后让编译器确定,然后在GHCi中键入以下几行:

Prelude> let i = 2 ^ 1000

Prelude> i 
107150860718626732094842504906000181056140481170553360744375038837035105112493612249319
837881569585812759467291755314682518714528569231404359845775746985748039345677748242309
854210746050623711418779541821530464749835819412673987675591655439460770629145711964776
86542167660429831652624386837205668069376

Prelude> :t i
i :: Integer

在这里,我完全感到困惑,显然, i的数量过大,但是i的返回类型仍然是Integer 我们该如何解释?Haskell Integer的上限或上限是多少?

在Haskell中, Integer从理论上讲是无界的整数类型。 固定宽度类型为IntInt8Int16Int32Int64以及相应的无符号WordWord8等。

实际上,即使是Integer ,当然也受可用内存或内部表示形式的限制。

默认情况下,GHC使用GMP包表示Integer ,这意味着边界为2^(2^37)左右,因为GMP使用32位整数存储肢体数。

在Haskell中, Integer没有上限。 它是无界整数类型。 Haskell中的Integer类似于Java中的BigInteger ,而Java中的Integer类似于Haskell中的Int Haskell中的Int的边界为[-2 ^ 63,2 ^ 63)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM