Haskell:
So sánh hai ngày

Làm thế nào:

Haskell, được biết đến một cách âm thầm với sự tinh khiết của mình, cần bạn nói chuyện về ngày tháng với những thư viện đúng đắn. Hãy dùng Data.Time.

import Data.Time

-- Định nghĩa hai ngày
date1 :: UTCTime
date1 = UTCTime (fromGregorian 2023 4 1) (secondsToDiffTime 0)

date2 :: UTCTime
date2 = UTCTime (fromGregorian 2024 4 2) (secondsToDiffTime 3600)

-- So sánh các ngày
compareDates :: UTCTime -> UTCTime -> Ordering
compareDates = compare

main :: IO ()
main = do
    print $ date1 `compareDates` date2 -- Kết quả sẽ là LT
    print $ date2 `compareDates` date1 -- Kết quả sẽ là GT
    print $ date1 `compareDates` date1 -- Kết quả sẽ là EQ

Rất đơn giản, phải không? LT cho ít hơn, GT cho nhiều hơn, và EQ cho bằng nhau.

Sâu hơn

Ngày xưa, việc xử lý thời gian của Haskell không mượt mà như bây giờ. Chúng ta phải cảm ơn sự tiến triển của thư viện Data.Time qua các năm. Nó cho chúng ta UTCTime, một điểm thời gian rõ ràng không gây hiểu nhầm.

Có lựa chọn khác không? Chắc chắn rồi. Bạn có thể thấy Data.Time.CalendarData.Time.Clock hữu ích cho các tình huống cụ thể. Cũng có thư viện time cũ cho những ai cảm thấy hoài niệm hoặc phải đối mặt với mã nguồn lỗi thời.

Bây giờ, vào chi tiết: Việc so sánh các ngày trong Haskell dựa trên UTCTime, kết hợp một ngày (Day) và một thời gian (DiffTime hoặc NominalDiffTime). Chính hàm compare làm nặng nhọc, một thành viên gọn gàng của lớp Ord, cho phép chúng ta sử dụng >, <, == và nhiều hơn nữa. Chỉ cần nhớ Haskell yêu thích sự an toàn kiểu dữ liệu của mình. Hãy chắc chắn bạn luôn so sánh đồng nhất, hoặc trong trường hợp của chúng ta, UTCTime với UTCTime.

Xem thêm

Hãy đi sâu hơn hoặc tìm sự giúp đỡ với những nguồn này: