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


169

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

답변:


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.