Was ist der Unterschied zwischen Int und Integer?

169

Was ist in Haskell der Unterschied zwischen einem Intund einem Integer? Wo ist die Antwort dokumentiert?

0xAX
quelle

Antworten:

183

"Integer" ist ein Typ mit beliebiger Genauigkeit: Er enthält eine beliebige Zahl, egal wie groß sie ist, bis zur Speichergrenze Ihres Computers. Dies bedeutet, dass Sie niemals arithmetische Überläufe haben. Andererseits bedeutet dies auch, dass Ihre Arithmetik relativ langsam ist. Lisp-Benutzer können hier den Typ "Bignum" erkennen.

"Int" ist die häufigere 32- oder 64-Bit-Ganzzahl. Die Implementierungen variieren, obwohl garantiert mindestens 30 Bit vorhanden sind.

Quelle: Das Haskell Wikibook . Möglicherweise finden Sie auch den Abschnitt Zahlen in Eine sanfte Einführung in Haskell hilfreich.

bcat
quelle
Nach dieser Antwort ist die Verwendung Integeroft schneller als
Maarten
6
@ Maarten, das liegt nur daran, dass es Int64auf 32-Bit-Systemen eher schlecht implementiert ist. Auf 64-Bit-Systemen ist es großartig.
dfeuer
21

Intist Bounded, was bedeutet , dass Sie verwenden können minBoundund maxBounddie Grenzen , um herauszufinden, was die Implementierung abhängig ist , aber zumindest zu halten , garantiert [-2 29 .. 2 29 -1].

Beispielsweise:

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

Ist Integerjedoch willkürliche Genauigkeit und nichtBounded .

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_Erfolg
quelle
10

Int ist das C int, was bedeutet, dass seine Werte von -2147483647 bis 2147483647 reichen, während ein Integer-Bereich von der gesamten Z- Menge, das heißt, er kann beliebig groß sein.

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

Beachten Sie den Wert des Int-Literals.

Ming-Tang
quelle
2
GHCi, Version 7.10.3 gibt Warnung: Literal 12345678901234567890 liegt außerhalb des Int-Bereichs -9223372036854775808..9223372036854775807
Adam
5

Das Prelude definiert nur die grundlegendsten numerischen Typen: Ganzzahlen mit fester Größe (Int), Ganzzahlen mit beliebiger Genauigkeit (Integer), ...

...

Der ganzzahlige Typ Int mit endlicher Genauigkeit deckt mindestens den Bereich [- 2 ^ 29, 2 ^ 29 - 1] ab.

aus dem Haskell-Bericht: http://www.haskell.org/onlinereport/basic.html#numbers

newacct
quelle
4

An Integerwird als implementiert, Int#bis es größer wird als der Maximalwert, den ein Int#Speicher speichern kann. Zu diesem Zeitpunkt ist es eine GMP- Nummer.

Nate Symer
quelle
2
Das klingt implementierungsspezifisch. Gibt es eine Referenz, die besagt, dass Integer auf diese Weise implementiert werden muss?
YoniLavi
4
Nein, Sie haben Recht, dies ist GHC-spezifisch. Das heißt, 1. GHC ist das, was die meisten Leute verwenden, 2. Dies ist der intelligenteste Weg, den ich mir vorstellen kann, um einen solchen Datentyp zu implementieren.
Nate Symer
Bedeutet dies, dass (in GHC) kein Leistungskompromiss für die Verwendung Integerbesteht und daher Integerimmer die bessere Option ist?
Kirk Broadhurst