La season
fonction utilise des fonctions algébriques mais j'ai l'impression que le code est répétitif.
Comment le rendre aussi court que possible?
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
la source
la source
Réponses:
Vous pouvez utiliser des gardes, car vous avez créé
Month
une instance deOrd
:la source
Ajoutez
Enum
aux deuxderiving
clauses de vos définitions de types de données, puisTrois mois dans une saison, quatre saisons dans une année, le printemps commençant en mars.
la source
Ceci est très similaire à la réponse de Will Ness (faire de l'arithmétique sur les indices mensuels via des
Enum
instances), mais avec quelques ajustements pour plus de lisibilité:Dans tous les cas, il y a quelque chose à dire à l'appui de votre solution d'origine répertoriant tous les cas de manière explicite, pour sa simplicité. La répétitivité de l'écriture peut être quelque peu réduite en utilisant une
case
déclaration au lieu de plusieurs équations.la source