Как сделать так, чтобы моя функция Haskell была максимально короткой?

12

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

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

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
Стивен Адамс
источник
Переименование вашей функции и конструкторов в одинарные буквы сократит ее на%)
Luqui

Ответы:

20

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

season :: Month -> Seasons
season m | m <= Feb = Winter
         | m <= May = Spring
         | m <= Aug = Summer
         | m <= Nov = Autumn
         | otherwise = Winter
Виллем Ван Онсем
источник
11

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

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

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

Уилл Несс
источник
7

Это очень похоже на ответ Уилла Несса (он выполняет арифметику по индексам месяца через 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Повторяемость в написании этого может быть несколько уменьшена путем использования -составления вместо нескольких уравнений.

duplode
источник
1
Я в недоумении с шаблонами голосования здесь. :) ОП запрашивает максимально короткий код. Ну что ж. :)
Уилл Несс