簡體   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