La season
función usa funciones algebraicas pero siento que el código es repetitivo.
¿Cómo lo hago lo más corto posible?
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
fuente
fuente
Respuestas:
Puedes usar guardias, ya que hiciste
Month
una instancia deOrd
:fuente
Agregue
Enum
a ambasderiving
cláusulas de definiciones de tipo de datos , luegoTres meses en una temporada, cuatro estaciones en un año, la primavera comienza en marzo.
fuente
Esto es muy similar a la respuesta de Will Ness (hacer cálculos aritméticos en índices mensuales a través de
Enum
instancias), solo con unos pocos ajustes en aras de la legibilidad:En cualquier caso, hay algo que decir en apoyo de su solución original que enumera todos los casos explícitamente, por su sencillez. La repetitividad en la escritura puede reducirse un poco mediante el uso de una
case
declaración en lugar de múltiples ecuaciones.fuente