A season
função usa funções algébricas, mas sinto que o código é repetitivo.
Como faço para torná-lo o mais curto possível?
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
Stephen Adams
fonte
fonte
Respostas:
Você pode fazer uso de guardas, pois criou
Month
uma instância deOrd
:fonte
Adicione
Enum
àsderiving
cláusulas das definições de tipo de dados e , em seguida,Três meses em uma estação, quatro estações em um ano, a primavera começa em março.
fonte
Isso é muito semelhante à resposta de Will Ness (fazendo aritmética nos índices do mês por meio de
Enum
instâncias), apenas com alguns ajustes para facilitar a leitura:De qualquer forma, há algo a ser dito em apoio à sua solução original, listando todos os casos explicitamente, por sua simplicidade. A repetitividade na escrita pode ser reduzida um pouco usando uma
case
declaração-em vez de várias equações.fonte