¿Cómo hago que mi Haskell funcione lo más corto posible?

12

La seasonfunció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
Stephen Adams
fuente
Cambiar el nombre de su función y constructores para que sean letras simples lo acortaría%)
luqui

Respuestas:

20

Puedes usar guardias, ya que hiciste Monthuna instancia de Ord:

season :: Month -> Seasons
season m | m <= Feb = Winter
         | m <= May = Spring
         | m <= Aug = Summer
         | m <= Nov = Autumn
         | otherwise = Winter
Willem Van Onsem
fuente
11

Agregue Enuma ambas derivingcláusulas de definiciones de tipo de datos , luego

season :: Month -> Seasons
season m  =  toEnum ((fromEnum m - 2) `div` 3 `mod` 4)

Tres meses en una temporada, cuatro estaciones en un año, la primavera comienza en marzo.

Will Ness
fuente
7

Esto es muy similar a la respuesta de Will Ness (hacer cálculos aritméticos en índices mensuales a través de Enuminstancias), solo con unos pocos ajustes en aras de la legibilidad:

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

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 casedeclaración en lugar de múltiples ecuaciones.

duplode
fuente
1
Estoy perdido con los patrones de votación aquí. :) el OP pide el código más corto posible. Oh bien. :)
Will Ness