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

169

Jaka jest różnica między an Inti an w Haskell Integer? Gdzie jest udokumentowana odpowiedź?

0xAX
źródło

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 .

bcat
źródło
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)
200_success
źródło
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.

Ming-Tang
źródło
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

newacct
źródło
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 .

Nate Symer
źródło
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