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