Lý do mà div
không trả lại Infinity
là đơn giản - không có đại diện cho vô cùng trong loại Integer
.
/
trả về Infinity
vì nó tuân theo chuẩn IEEE 754 (mô tả số đại diện cho số dấu phẩy động) vì loại mặc định Fractional
là Double
. Các ngôn ngữ khác có số dấu phẩy động (ví dụ: JavaScript) cũng thể hiện hành vi này.
Để làm cho các nhà toán học co rúm người lại hơn nữa, bạn có được một kết quả khác nhau nếu bạn chia tiêu cực 0, mặc dù thực tế rằng -0 == 0
cho nổi:
Prelude> 1/(-0)
-Infinity
Đây cũng là hành vi từ tiêu chuẩn.
Nếu bạn sử dụng một loại phân đoạn khác nhau như Rational
, bạn sẽ nhận được hành vi mà bạn mong đợi:
Prelude> 1/(0 :: Rational)
*** Exception: Ratio.%: zero denominator
Thật trùng hợp, nếu bạn đang băn khoăn về việc tại sao Integer
và Double
là các loại trong câu hỏi khi hoạt động thực tế của bạn không tham khảo chúng, hãy xem cách Haskell xử lý các loại mặc định (đặc biệt là kiểu số) trong report.
Phiên bản ngắn gọn là nếu bạn có loại không rõ ràng từ lớp Num
, Haskell trước tiên sẽ thử Integer
và sau đó Double
cho loại đó. Bạn có thể thay đổi điều này bằng câu lệnh default (Type1, Type2...)
hoặc tắt bằng tuyên bố default()
ở cấp mô-đun.
Nguồn
2012-02-19 22:52:34
Về mặt toán học, có kết quả của '1/0' là' Infinity' là hoàn toàn hợp lý. Nó không phải là giá trị trả lại chính đáng duy nhất, mà là giá trị có ý nghĩa nhất. Lưu ý rằng bạn cũng sẽ nhận được lỗi 'chia cho số không' nếu bạn đánh giá' 1/0 :: Rational'. –
@ DanielFischer: Tôi sẽ không gọi nó là "toán học hoàn toàn hợp lý", vì kiểu nén này (với cực dương và âm) phá hủy khá nhiều định lý giữ ℝ, và một số giả định trong nhiều chương trình. – leftaroundabout
Bạn không nên giả định những thứ như thế khi làm việc với các số dấu phẩy động. Ngay cả các tính chất cơ bản như kết hợp không nhất thiết phải giữ. Bình đẳng cũng không phản xạ cho 'NaN' (Ví dụ '(0/0)/= (0/0)' –