Int와 Integer의 차이점은 무엇입니까?


169

Haskell에서 IntInteger? 의 차이점은 무엇 입니까? 답은 어디에 기록되어 있습니까?

답변:


183

"정수 (Integer)"는 임의의 정밀도 유형입니다. 기계 메모리의 한계까지 아무리 클지라도 아무 숫자 나 보유 할 수 있습니다…. 이것은 산술 오버플로가 없다는 것을 의미합니다. 반면에 그것은 산술이 상대적으로 느리다는 것을 의미합니다. Lisp 사용자는 여기서 "bignum"유형을 인식 할 수 있습니다.

"Int"는보다 일반적인 32 또는 64 비트 정수입니다. 구현은 다양하지만 최소 30 비트로 보장됩니다.

출처 : 하스켈 Wikibook . 또한 Haskell대한 부드러운 소개숫자 섹션이 유용 할 수 있습니다.


이 답변 에 따르면 , 사용 Integer이 종종 더 빠릅니다
Maarten

6
@Maarten, 그것은 Int6432 비트 시스템에서 다소 잘못 구현 되었기 때문 입니다. 64 비트 시스템에서는 훌륭합니다.
dfeuer

21

Int는 구현에 따라 다르지만 최소한 [-2 29 .. 2 29 -1] 을 유지하도록 보장되는 한계를 Bounded사용 minBound하고 maxBound찾을 수 있음을 의미합니다 .

예를 들면 다음과 같습니다.

Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)

그러나 Integer임의의 정밀도이며 그렇지 않습니다 Bounded.

Prelude> (minBound, maxBound) :: (Integer, Integer)

<interactive>:3:2:
    No instance for (Bounded Integer) arising from a use of `minBound'
    Possible fix: add an instance declaration for (Bounded Integer)
    In the expression: minBound
    In the expression: (minBound, maxBound) :: (Integer, Integer)
    In an equation for `it':
        it = (minBound, maxBound) :: (Integer, Integer)


10

Int는 C int이며, 값의 범위는 -2147483647에서 2147483647까지이며 전체 Z 세트 의 정수 범위는 임의로 클 수 있습니다.

$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)

Int 리터럴의 값을 확인하십시오.


2
GHCi, 버전 7.10.3에 경고가 표시됨 : 리터럴 12345678901234567890이 Int 범위를 벗어남 -9223372036854775808..9223372036854775807
Adam


4

Integerint로서 구현 Int#그것이 최대 값보다 클 때까지 Int#저장할 수있다. 이때는 GMP 번호입니다.


2
구현에 따라 다릅니다. Integer를 이런 식으로 구현해야한다는 언급이 있습니까?
yoniLavi

4
아니, 맞아, 이것은 GHC에 특정한 것이다. 1. GHC는 대부분의 사람들이 사용하는 것입니다. 2. 이것이 그러한 데이터 유형을 구현할 수있는 가장 지능적인 방법입니다.
Nate Symer

이것은 (GHC에서) 사용 Integer에 대한 성능 상충 관계가 없으므로 Integer항상 더 나은 옵션 이라는 것을 의미합니까 ?
Kirk Broadhurst
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.