Jaka jest różnica między Int i Integer?


Odpowiedzi:


183

„Liczba całkowita” to typ o dowolnej precyzji: może pomieścić dowolną liczbę bez względu na wielkość, aż do limitu pamięci maszyny…. Oznacza to, że nigdy nie masz przepełnień arytmetycznych. Z drugiej strony oznacza to również, że twoja arytmetyka jest stosunkowo powolna. Użytkownicy Lispa mogą tutaj rozpoznać typ „bignum”.

„Int” to bardziej popularna 32- lub 64-bitowa liczba całkowita. Implementacje są różne, chociaż gwarantuje się co najmniej 30 bitów.

Źródło: The Haskell Wikibook . Przydatna może być również sekcja Liczby w Delikatnym wprowadzeniu do Haskella .


Zgodnie z tą odpowiedzią , używanie Integerjest często szybsze niż jest
Maarten

6
@Maarten, to tylko dlatego, że Int64jest raczej źle zaimplementowany w systemach 32-bitowych. W systemach 64-bitowych jest świetny.
dfeuer

21

Intto Bounded, co oznacza, że można wykorzystać minBoundi maxBoundaby dowiedzieć się w granicach, które są zależne od implementacji, ale gwarantuje się co najmniej [-2 29 .. 2 29 1].

Na przykład:

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

Jednak Integerjest arbitralna precyzja, a nie 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 to C int, co oznacza, że ​​jego wartości mieszczą się w zakresie od -2147483647 do 2147483647, podczas gdy zakres Integer z całego zbioru Z oznacza, że ​​może być dowolnie duży.

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

Zwróć uwagę na wartość literału Int.


2
GHCi w wersji 7.10.3 ostrzega: Dosłowny 12345678901234567890 jest poza zakresem Int -9223372036854775808..9223372036854775807
Adam

5

Prelude definiuje tylko najbardziej podstawowe typy liczbowe: liczby całkowite o stałej wielkości (Int), liczby całkowite o dowolnej precyzji (Integer), ...

...

Typ liczby całkowitej o skończonej precyzji Int obejmuje co najmniej zakres [- 2 ^ 29, 2 ^ 29 - 1].

z raportu Haskella: http://www.haskell.org/onlinereport/basic.html#numbers


4

An Integerjest zaimplementowany jako wartość, Int#dopóki nie będzie większa niż maksymalna wartość, jaką Int#może przechowywać. W tym momencie jest to numer GMP .


2
Brzmi to specyficznie dla implementacji. Czy istnieje odniesienie mówiące, że Integer należy zaimplementować w ten sposób?
yoniLavi

4
Nie, masz rację, to jest specyficzne dla GHC. To powiedziawszy, 1. GHC jest tym, czego używa większość ludzi, 2. Jest to najbardziej inteligentny sposób, jaki mogę wymyślić, aby zaimplementować taki typ danych.
Nate Symer,

Czy to oznacza, że ​​(w GHC) nie ma kompromisu między wydajnością Integeri dlatego Integerzawsze jest lepszą opcją?
Kirk Broadhurst
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.