2013-08-11 4 views
0

숫자 문제를 풀기 위해 숫자 2^1000의 숫자 합을 얻고 싶습니다.Haskell에서 Integer의 상한은 무엇입니까?

자바에서이 솔루션은 같은 것입니다 :

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

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

는 다음과 같이 하스켈 솔루션을 내놓았다 :

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

전체 프로세스는 한 점은 흥미 꽤 부드러운 것, 우리 알 수있는 정수형은 2^1000을 Java에서 처리 할 수 ​​없으므로 BigInteger을 사용하고 문자열에 큰 숫자를 사용하는 것이 분명하지만 Haskell에서는 컴파일 오류가 발생하지 않으므로 2^1000을 직접 전달할 수 있습니다. 하스켈은 내부적으로 숫자를 문자열로 변환합니까? 그때 내가 GHCi에 다음 줄을 입력 유형이 무엇인지 확인하고 컴파일러가 결정하도록 할 :

Prelude> let i = 2^1000 

Prelude> i 
107150860718626732094842504906000181056140481170553360744375038837035105112493612249319 
837881569585812759467291755314682518714528569231404359845775746985748039345677748242309 
854210746050623711418779541821530464749835819412673987675591655439460770629145711964776 
86542167660429831652624386837205668069376 

Prelude> :t i 
i :: Integer 

을 여기에, 나는 완전히 혼란스러워했다, 분명히, i의 수는 대형이다 반환 유형은 i이고 여전히 Integer입니다. 우리는 어떻게 이것을 설명 할 수 있으며 하스켈의 Integer의 상한선이나 한계는 무엇입니까?

+0

dup : http://stackoverflow.com/questions/3429291/haskell-int-and-integer –

답변

10

하스켈에서 Integer은 이론적으로 제한이없는 정수 유형입니다. 고정 폭 형식도 Integer 인스턴스의 사용 가능한 메모리, 경계 물론, 또는 내부 표현으로 Int, Int8, Int16, Int32, Int64 연습에서 해당 부호 Word, Word8

이다.

기본적으로 GHC는 Integer을 나타내는 GMP 패키지를 사용하며 GMP는 팔다리 수를 저장하기 위해 GMP가 32 비트 정수를 사용하기 때문에 2^(2^37) 정도입니다.

-1

Integer에는 Haskell에서 상한이 없습니다. 무한 정수형이다. Haskell의 Integer은 Java의 경우 BigInteger이고 Java의 경우 Integer은 하스켈의 Int과 같습니다. 하스켈에있는 Int은 [-2^63, 2^63]의 경계를 가지고 있습니다.

+6

'Int'가 하스켈에서 [-2^29,2^29] 이상인 것으로 보증 된 범위. – augustss

관련 문제