Come posso rendere la mia funzione Haskell il più corta possibile?


12

La seasonfunzione utilizza funzioni algebriche ma ritengo che il codice sia ripetitivo.

Come posso renderlo il più corto possibile?

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

Rinominare la tua funzione e i costruttori in lettere singole lo accorcerebbe in%)
luqui

Risposte:


20

Puoi utilizzare le protezioni, poiché hai creato Monthun'istanza di Ord:

season :: Month -> Seasons
season m | m <= Feb = Winter
         | m <= May = Spring
         | m <= Aug = Summer
         | m <= Nov = Autumn
         | otherwise = Winter

11

Aggiungi quindi Enuma entrambe le derivingclausole delle definizioni dei tipi di dati

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

Tre mesi in una stagione, quattro stagioni in un anno, la primavera inizia a marzo.


7

Questo è molto simile alla risposta di Will Ness (facendo aritmetica sugli indici dei mesi attraverso le Enumistanze), solo con alcune modifiche per motivi di leggibilità:

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

In ogni caso, c'è qualcosa da dire a supporto della soluzione originale che elenca tutti i casi in modo esplicito, per la sua semplicità. La ripetitività nella scrittura può essere in qualche modo ridotta usando una casedichiarazione anziché più equazioni.


1
Sono in perdita con gli schemi di voto qui. :) l'OP richiede il codice più breve possibile. Oh bene. :)
Will Ness,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.