Apa perbedaan antara Int dan Integer?


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.


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)


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.


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


4

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.