Làm cách nào để thực hiện chức năng Haskell của mình càng ngắn càng tốt?


12

Các seasonchức năng sử dụng chức năng đại số nhưng tôi cảm thấy như đang lặp đi lặp lại.

Làm thế nào để tôi làm cho nó càng ngắn càng tốt?

data Month = Jan | Feb | Mar | Apr | May | June | July | Aug | Sept| Oct | Nov | Dec
     deriving (Eq,Ord,Show,Read)

data Seasons = Spring | Summer | Autumn | Winter
     deriving (Eq,Ord,Show,Read)

season :: Month -> Seasons
season Jan = Winter
season Feb = Winter
season Mar = Spring
season Apr = Spring
season May = Spring
season June = Summer
season July = Summer
season Aug = Summer
season Sept = Autumn
season Oct = Autumn
season Nov = Autumn
season Dec = Winter

Đổi tên hàm và hàm tạo của bạn thành các chữ cái đơn sẽ rút ngắn%)
luqui

Câu trả lời:


20

Bạn có thể sử dụng các vệ sĩ, vì bạn đã thực hiện Monthmột ví dụ về Ord:

season :: Month -> Seasons
season m | m <= Feb = Winter
         | m <= May = Spring
         | m <= Aug = Summer
         | m <= Nov = Autumn
         | otherwise = Winter

11

Thêm vào các mệnh đề Enumđịnh nghĩa kiểu dữ liệu của bạn deriving, sau đó

season :: Month -> Seasons
season m  =  toEnum ((fromEnum m - 2) `div` 3 `mod` 4)

Ba tháng trong một mùa, bốn mùa trong một năm, mùa xuân bắt đầu từ tháng ba.


7

Điều này rất giống với câu trả lời của Will Ness (thực hiện số học trên các chỉ số tháng thông qua các Enumtrường hợp), chỉ với một vài điều chỉnh vì mục đích dễ đọc:

data Month = Jan | Feb | Mar | Apr | May | June | July | Aug | Sept | Oct | Nov | Dec
     deriving (Eq, Ord, Show, Read, Enum)

data Season = Spring | Summer | Autumn | Winter
     deriving (Eq, Ord, Show, Read, Enum)

season :: Month -> Season
season = toEnum . (`div` 3) . monthIndexStartingFrom Mar
    where
    monthIndexStartingFrom :: Month -> Month -> Int
    monthIndexStartingFrom base month = (fromEnum month - fromEnum base) `mod` 12

Trong mọi trường hợp, có một điều gì đó được nói để hỗ trợ cho giải pháp ban đầu của bạn liệt kê tất cả các trường hợp một cách rõ ràng, vì sự đơn giản tuyệt đối của nó. Sự lặp đi lặp lại trong văn bản nó có thể được giảm bớt phần nào bằng cách sử dụng một case-statement thay vì nhiều phương trình.


1
Tôi đang thua lỗ với các mẫu biểu quyết ở đây. :) OP yêu cầu mã ngắn nhất có thể. ồ :)
Will Ness
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.