Wie mache ich meine Haskell-Funktion so kurz wie möglich?

12

Die seasonFunktion verwendet algebraische Funktionen, aber ich denke, der Code wiederholt sich.

Wie mache ich es so kurz wie möglich?

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
quelle
Das Umbenennen Ihrer Funktion und Konstruktoren in einzelne Buchstaben würde sie verkürzen%)
luqui

Antworten:

20

Sie können Wachen verwenden, da Sie Montheine Instanz von Ord:

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

Fügen EnumSie derivingdann die Klauseln Ihrer beiden Datentypdefinitionen hinzu

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

Drei Monate in einer Saison, vier Jahreszeiten in einem Jahr, der Frühling beginnt im März.

Will Ness
quelle
7

Dies ist der Antwort von Will Ness (Rechnen mit Monatsindizes durch EnumInstanzen) sehr ähnlich , nur aus Gründen der Lesbarkeit mit ein paar Änderungen:

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 jedem Fall gibt es etwas zu sagen, das Ihre ursprüngliche Lösung unterstützt und alle Fälle explizit auflistet, da sie so einfach ist. Die Wiederholbarkeit beim Schreiben kann durch Verwendung einer caseAnweisung anstelle mehrerer Gleichungen etwas verringert werden.

Duplode
quelle
1
Ich bin mit den Abstimmungsmustern hier ratlos. :) Das OP fragt nach dem kürzestmöglichen Code. Naja. :)
Will Ness