Como faço para que minha função Haskell seja o mais curta possível?

12

A seasonfunçã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
Stephen Adams
fonte
Renomear sua função e construtores para serem letras únicas diminui%)
luqui 30/03

Respostas:

20

Você pode fazer uso de guardas, pois criou Monthuma instância de Ord:

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

Adicione Enumàs derivingcláusulas das definições de tipo de dados e , em seguida,

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

Três meses em uma estação, quatro estações em um ano, a primavera começa em março.

Will Ness
fonte
7

Isso é muito semelhante à resposta de Will Ness (fazendo aritmética nos índices do mês por meio de Enuminstâncias), apenas com alguns ajustes para facilitar a leitura:

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

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 casedeclaração-em vez de várias equações.

duplicar
fonte
11
Estou perplexo com os padrões de votação aqui. :) o OP solicita o menor código possível. Ah bem. :)
Will Ness