Как сделать мою функцию Haskell максимально короткой? - PullRequest
12 голосов
/ 28 марта 2020

Функция season использует функции алгебры c, но мне кажется, что код повторяется.

Как сделать его максимально коротким?

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

Ответы [ 3 ]

20 голосов
/ 28 марта 2020

Вы можете использовать охранников, так как вы сделали Month экземпляром Ord:

season :: Month -> Seasons
season m | <b>m <= Feb</b> = Winter
         | <b>m <= May</b> = Spring
         | <b>m <= Aug</b> = Summer
         | <b>m <= Nov</b> = Autumn
         | otherwise = Winter
11 голосов
/ 29 марта 2020

Добавьте Enum к обоим пунктам deriving определений типов данных, затем

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

Три месяца в сезоне, четыре сезона в году, весна, начинающаяся в марте.

7 голосов
/ 29 марта 2020

Это очень похоже на ответ Уилла Несса (выполнение арифметики c на индексах месяца через Enum экземпляров), только с несколькими настройками для удобства чтения:

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

В любом случае, есть что сказать в поддержку вашего исходного решения, в котором перечислены все случаи в явном виде, для его очевидной простоты. Повторяемость в написании текста может быть несколько уменьшена путем использования case -статации вместо нескольких уравнений.

...