Haskell işlevimi mümkün olduğunca kısa hale nasıl getirebilirim?


12

seasonFonksiyonu cebirsel fonksiyonlar kullanır ama kod tekrarlayan gibi hissediyorum.

Mümkün olduğunca kısa nasıl yapabilirim?

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

İşlevinizi ve yapıcılarınızı tek harf olacak şekilde yeniden adlandırmak% 'ı kısaltır)
luqui

Yanıtlar:


20

MonthBir örnek oluşturduğunuz için korumalardan yararlanabilirsiniz Ord:

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

11

EnumHem veri türü tanımlarınızın derivingcümleciklerini ekleyin , ardından

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

Bir sezonda üç ay, bir yılda dört mevsim, ilkbahar Mart ayında başlar.


7

Bu, Will Ness'in cevabına çok benzer ( Enumörnekler aracılığıyla ay endekslerinde aritmetik yapmak ), sadece okunabilirlik uğruna birkaç değişiklikle:

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

Her halükarda, basit çözümü için, tüm durumları açıkça listeleyen orijinal çözümünüzü destekleyen söylenecek bir şey vardır. caseYazmadaki tekrarlama, birden çok denklem yerine bir- durum kullanılarak azaltılabilir .


1
Buradaki oylama düzenini kaybediyorum. :) OP mümkün olan en kısa kodu ister. Oh iyi. :)
Ness
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.