숫자 문제를 풀기 위해 숫자 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
의 상한선이나 한계는 무엇입니까?
dup : http://stackoverflow.com/questions/3429291/haskell-int-and-integer –