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
haskell
algebraic-data-types
Стивен Адамс
источник
источник
Ответы:
Вы можете использовать охранников, так как вы сделали
Month
экземплярOrd
:источник
Добавьте
Enum
к обоимderiving
пунктам определения типов данных , затемТри месяца в сезоне, четыре сезона в году, весна начинается в марте.
источник
Это очень похоже на ответ Уилла Несса (он выполняет арифметику по индексам месяца через
Enum
экземпляры), только с несколькими изменениями для удобства чтения:В любом случае, есть что сказать в поддержку вашего исходного решения, перечислив все случаи в явном виде, для его очевидной простоты.
case
Повторяемость в написании этого может быть несколько уменьшена путем использования -составления вместо нескольких уравнений.источник