Sự khác biệt giữa Int và Integer là gì?


169

Trong Haskell, sự khác biệt giữa an Intvà an là Integergì? Câu trả lời được ghi nhận ở đâu?

Câu trả lời:


183

"Số nguyên" là loại chính xác tùy ý: nó sẽ giữ bất kỳ số nào cho dù lớn đến mức nào, đến giới hạn bộ nhớ máy của bạn. Điều này có nghĩa là bạn không bao giờ có tràn số học. Mặt khác, điều đó cũng có nghĩa là số học của bạn tương đối chậm. Người dùng Lisp có thể nhận ra loại "bignum" ở đây.

"Int" là số nguyên 32 hoặc 64 bit phổ biến hơn. Việc triển khai khác nhau, mặc dù nó được đảm bảo ít nhất là 30 bit.

Nguồn: Wikaskook Haskell . Ngoài ra, bạn có thể thấy phần Số của Giới thiệu nhẹ nhàng về Haskell hữu ích.


Theo câu trả lời này , việc sử dụng Integerthường nhanh hơn so với
Maarten

6
@Maarten, đó chỉ Int64là do được triển khai khá tệ trên các hệ thống 32 bit. Trên các hệ thống 64 bit, thật tuyệt vời.
dfeuer

21

IntBounded, điều đó có nghĩa là bạn có thể sử dụng minBoundmaxBoundtìm ra các giới hạn, phụ thuộc vào việc triển khai nhưng được đảm bảo giữ ít nhất [-2 29 .. 2 29 -1].

Ví dụ:

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

Tuy nhiên, Integerlà chính xác tùy ý, và không 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 là C int, có nghĩa là các giá trị của nó nằm trong phạm vi từ -2147483647 đến 2147483647, trong khi phạm vi Integer từ toàn bộ Z , có nghĩa là, nó có thể lớn tùy ý.

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

Lưu ý giá trị của chữ Int.


2
GHCi, phiên bản 7.10.3 đưa ra cảnh báo: Nghĩa đen 12345678901234567890 nằm ngoài phạm vi Int -9223372036854775808..9223372036854775807
Adam

5

Prelude chỉ định nghĩa các loại số cơ bản nhất: số nguyên có kích thước cố định (Int), số nguyên chính xác tùy ý (Số nguyên), ...

...

Kiểu số nguyên có độ chính xác hữu hạn Int bao gồm ít nhất là phạm vi [- 2 ^ 29, 2 ^ 29 - 1].

từ báo cáo Haskell: http://www.haskell.org/onlinereport/basic.html#numbers


4

An Integerđược thực hiện như một Int#cho đến khi nó lớn hơn giá trị tối đa mà nó Int#có thể lưu trữ. Tại thời điểm đó, đó là một số GMP .


2
Điều này âm thanh thực hiện cụ thể. Có một tài liệu tham khảo nói rằng Integer cần phải được thực hiện theo cách này?
yoniLavi

4
Không, bạn nói đúng, đây là GHC cụ thể. Điều đó nói rằng, 1. GHC là thứ mà hầu hết mọi người sử dụng, 2. Đây là cách thông minh nhất mà tôi có thể nghĩ ra để thực hiện một kiểu dữ liệu như vậy.
Nate Symer

Điều này có nghĩa là (trong GHC) không có sự đánh đổi hiệu suất để sử dụng Integer, và do đó Integerluôn là lựa chọn tốt hơn?
Kirk Broadhurst
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.