Apa perbedaan antara Int dan Integer?

169

Dalam Haskell, apa perbedaan antara Intdan Integer? Di mana jawabannya didokumentasikan?

0xAX
sumber

Jawaban:

184

"Integer" adalah tipe presisi yang arbitrer: ia akan menampung angka berapapun besar, hingga batas memori mesin Anda…. Ini berarti Anda tidak pernah memiliki kelebihan aritmatika. Di sisi lain itu juga berarti aritmatika Anda relatif lambat. Pengguna Lisp dapat mengenali tipe "bignum" di sini.

"Int" adalah integer 32 atau 64 bit yang lebih umum. Implementasinya bervariasi, meskipun dijamin setidaknya 30 bit.

Sumber: Wikibook Haskell . Juga, Anda dapat menemukan bagian Numbers dari A Gentle Introduction to Haskell berguna.

bcat
sumber
Menurut jawaban ini , menggunakan Integerseringkali lebih cepat daripada itu
Maarten
6
@ Maarten, itu hanya karena Int64diimplementasikan agak buruk pada sistem 32-bit. Pada sistem 64-bit, itu hebat.
dfeuer
22

Intadalah Bounded, yang berarti bahwa Anda dapat menggunakan minBounddan maxBounduntuk mengetahui batas-batasnya, yang bergantung pada implementasi tetapi dijamin untuk memiliki setidaknya [-2 29 .. 2 29 -1].

Sebagai contoh:

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

Namun, Integerpresisi sewenang-wenang, dan tidak 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_sukses
sumber
10

Int adalah C int, yang artinya nilainya berkisar dari -2147483647 hingga 2147483647, sedangkan rentang Integer dari seluruh set Z , itu berarti, ia bisa berukuran besar secara sewenang-wenang.

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

Perhatikan nilai literal Int.

Ming-Tang
sumber
2
GHCi, versi 7.10.3 memberi peringatan: Literal 12345678901234567890 berada di luar kisaran Int -9223372036854775808..9223372036854775807
Adam
5

Prelude hanya mendefinisikan tipe numerik yang paling dasar: bilangan bulat berukuran tetap (Int), bilangan bulat presisi acak (Bilangan), ...

...

Tipe integer presisi-terbatas mencakup setidaknya rentang [- 2 ^ 29, 2 ^ 29 - 1].

dari laporan Haskell: http://www.haskell.org/onlinereport/basic.html#numbers

berita baru
sumber
4

Sebuah Integerdiimplementasikan sebagai Int#sampai lebih besar dari nilai maksimum yang Int#dapat disimpan. Pada saat itu, ini adalah nomor GMP .

Nate Symer
sumber
2
Ini terdengar implementasi spesifik. Apakah ada referensi yang mengatakan bahwa Integer perlu diimplementasikan dengan cara ini?
yoniLavi
4
Tidak, Anda benar, ini khusus GHC. Yang mengatakan, 1. GHC adalah apa yang kebanyakan orang gunakan, 2. Ini adalah cara paling cerdas yang dapat saya pikirkan untuk mengimplementasikan tipe data seperti itu.
Nate Symer
Apakah ini berarti bahwa (dalam GHC) tidak ada tradeoff kinerja untuk digunakan Integer, dan karena Integeritu selalu merupakan opsi yang lebih baik?
Kirk Broadhurst