it-swarm.dev

Was ist der Unterschied zwischen Int und Integer?

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

156
0xAX

"Integer" ist ein beliebiger Präzisionstyp: Er kann eine beliebige Zahl aufnehmen, egal wie groß sie ist, bis zur Grenze des Arbeitsspeichers Ihrer Maschine. Das heißt, Sie haben nie arithmetische Überläufe. Andererseits bedeutet dies auch, dass Ihre Arithmetik relativ langsam ist. LISP-Benutzer können hier den Typ "Bignum" erkennen.

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

Quelle: Das Haskell Wikibook . Auch der Abschnitt Numbers in Eine sanfte Einführung in Haskell kann hilfreich sein.

168
bcat

Int ist Bounded, was bedeutet, dass Sie minBound und maxBound verwenden können, um die Grenzen herauszufinden, die implementierungsabhängig sind, aber garantiert mindestens gelten [-229 .. 229-1].

Beispielsweise:

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

Integer ist jedoch eine willkürliche Genauigkeit und nicht 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)
19
200_success

Int ist der Typ von Maschinen-Ganzzahlen mit einem garantierten Bereich von mindestens -229 zu 229 - 1, während Ganzzahl eine Ganzzahl mit willkürlicher Genauigkeit ist, deren Bereich so groß ist, wie Sie Speicher für haben.

https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html

19

Int ist das C int, was bedeutet, dass seine Werte von -2147483647 bis 2147483647 reichen, während ein Integer-Bereich aus dem ganzen Z gesetzt ist, das heißt, es kann sein beliebig groß.

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

Beachten Sie den Wert des Int-Literal.

10
Ming-Tang

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

...

Der Intertyp 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

5
newacct

Ein Integer ist implementiert als Int# bis es größer wird als der Maximalwert und Int# kann speichern. Zu diesem Zeitpunkt ist es eine GMP Zahl.

4
Nate Symer

Integer ermöglicht aggressivere Optimierungen, da es nicht so stark durch undefiniertes Verhalten infolge von Überläufen eingeschränkt wird.

der Compiler muss also davon ausgehen, dass der Ausdruck so, wie er geschrieben wurde, niemals ein undefiniertes Verhalten erfährt und dass alle möglichen Optimierungen, die der Compiler einführt, auch kein neues undefiniertes Verhalten hervorrufen.

oder auf andere Weise

der Ausdruck a - (b - c) ist algebraisch äquivalent zu (a + c) - b aber der Compiler kann diese Neuanordnung nicht vornehmen, da es möglich ist, dass der Zwischenwert a + c läuft mit Eingaben über, die im Original keinen Überlauf verursachen würden.

0
Famous Jameis