मैं अपने हास्केल फ़ंक्शन को यथासंभव कम कैसे बनाऊं?


12

seasonसमारोह बीजीय कार्यों का उपयोग करता है, लेकिन मुझे लगता है कि कोड की तरह दोहराव है।

मैं इसे यथासंभव छोटा कैसे बनाऊं?

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

अपने फ़ंक्शन और कंस्ट्रक्टर्स का नामकरण एकल अक्षरों के होने के कारण इसे छोटा कर दिया जाएगा)
luqui

जवाबों:


20

आप का उपयोग कर सकते हैं गार्ड, के बाद से आप Monthएक उदाहरण Ord:

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

11

जोड़े Enumदोनों अपने डेटा प्रकार परिभाषाएँ 'के लिए derivingखंड, तो

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

एक मौसम में तीन महीने, साल में चार मौसम, मार्च में वसंत शुरू होता है।


7

यह विल नेस के उत्तर के समान है ( Enumउदाहरणों के माध्यम से महीने के सूचकांकों पर अंकगणित करना ) के समान है, केवल पठनीयता के लिए कुछ ट्विक्स के साथ:

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

किसी भी मामले में, आपके मूल समाधान के समर्थन में कही जाने वाली सभी बातों को स्पष्ट रूप से, इसके सरासर सीधेपन के लिए कहा जाना चाहिए। इसे लिखने में दोहराव caseको कई समीकरणों के बजाय -statement का उपयोग करके कुछ हद तक कम किया जा सकता है।


1
मैं यहां वोटिंग पैटर्न के साथ नुकसान में हूं। :) ओपी संभव सबसे कम कोड के लिए पूछते हैं। ओह अच्छा। :)
विल नेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.