ฉันจะทำให้ฟังก์ชัน Haskell ของฉันสั้นที่สุดเท่าที่จะทำได้ได้อย่างไร


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

นี่คล้ายกับคำตอบของ Will Ness (การคำนวณทางคณิตศาสตร์ในดัชนีเดือนผ่าน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แทนที่จะเป็นหลายสมการ


1
ฉันกำลังแพ้กับรูปแบบการลงคะแนนที่นี่ :) OP ขอรหัสสั้นที่สุดเท่าที่จะทำได้ โอ้ดี :)
Will Ness
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.