Câu trả lời:
"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.
Int64
là 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.
Int
là Bounded
, điều đó có nghĩa là bạn có thể sử dụng minBound
và maxBound
tì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, Integer
là 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)
Int là loại số nguyên máy, với phạm vi được bảo đảm ít nhất -2 29 đến 2 29 - 1, trong khi Integer là số nguyên chính xác tùy ý, với phạm vi lớn như bạn có bộ nhớ.
https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html
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.
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
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 .
Integer
, và do đó Integer
luôn là lựa chọn tốt hơn?
Integer
thường nhanh hơn so với