season
Funkcja używa funkcji algebraicznych ale czuję, że kod jest powtarzalne.
Jak mogę to zrobić tak krótko, jak to możliwe?
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
źródło
źródło
Odpowiedzi:
Możesz skorzystać ze strażników, ponieważ wykonałeś
Month
instancjęOrd
:źródło
Następnie dodaj
Enum
do obu definicji definicji typu danychderiving
Trzy miesiące w sezonie, cztery pory roku, wiosna od marca.
źródło
Jest to bardzo podobne do odpowiedzi Willa Nessa (wykonywanie arytmetyki na indeksach miesięcznych poprzez
Enum
instancje), z kilkoma drobnymi poprawkami ze względu na czytelność:W każdym razie jest coś, co można powiedzieć na poparcie twojego oryginalnego rozwiązania, wymieniając wszystkie przypadki wyraźnie, ze względu na jego prostotę. Powtarzalność w pisaniu może być nieco zmniejszona poprzez użycie
case
-statement zamiast wielu równań.źródło