Bagaimana cara membuat fungsi Haskell saya sesingkat mungkin?

12

The seasonFungsi menggunakan fungsi aljabar tapi aku merasa seperti kode berulang-ulang.

Bagaimana saya membuatnya sesingkat mungkin?

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
sumber
Mengganti nama fungsi dan konstruktor Anda menjadi huruf tunggal akan mempersingkatnya%)
luqui

Jawaban:

20

Anda dapat menggunakan penjaga, karena Anda membuat Monthinstance dari Ord:

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

Tambahkan Enumke kedua definisi tipe data Anda 'deriving klausa , lalu

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

Tiga bulan dalam satu musim, empat musim dalam setahun, musim semi dimulai pada bulan Maret.

Will Ness
sumber
7

Ini sangat mirip dengan jawaban Will Ness (melakukan aritmatika pada indeks bulan melalui Enuminstance), hanya dengan beberapa penyesuaian demi keterbacaan:

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

Bagaimanapun, ada sesuatu yang bisa dikatakan untuk mendukung solusi asli Anda yang mencantumkan semua kasus secara eksplisit, karena keterusterangannya. Pengulangan dalam menulis itu dapat dikurangi dengan menggunakan- casepernyataan bukan beberapa persamaan.

duplode
sumber
1
Saya bingung dengan pola pemungutan suara di sini. :) OP memang meminta kode sesingkat mungkin. Baiklah. :)
Will Ness