haskell 枚举 - 如果值构造函数需要值而不是空值,该怎么办?给出需求场景

标签 haskell enums derived-types derived-instances

LYAHDerived Instances 说那

[...] all the value constructors are nullary (take no parameters, i.e. fields), we can make it part of the Enum typeclass.

data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday
deriving (Eq, Ord, Show, Read, Bounded, Enum)


现在,如果我花几个月的时间

data month = January | February | March | April | May | June | July | August |September | October | November |December     
deriving (Eq, Ord, Show, Read, Bounded, Enum)


我的问题是:
  • 在哪里存储每个月的 Max Days 值?
  • 如果是闰年,如何提及和控制二月份的月份,那么二月份的 maxDays 是 29 天,否则它将是 28 天?

  • 在 Java 中,可以编写如下所示的代码:

    public enum Month {  
        January (31),  
        February (29),  
        March (31),  
        April (30),  
        May (31),  
        June (30),  
        July (31),  
        August (31),  
        September (30),           
        October (31),  
        November (30),  
        December (31),  
        ;  
        private int maxDays; // instance variables  
        private (int maxDays) { // constructors always private  
               this.maxDays = maxDays;  
        }  
        Public int getMaxDays () {  
           return maxDays;  
        }
    

    最佳答案

    这应该有效。

    data Month = January | February | March | April | May
               | June | July | August |September | October
               | November | December
               deriving (Eq, Ord, Show, Read, Bounded, Enum)
    
    type Year = Int
    
    isLeapYear :: Year -> Bool
    isLeapYear year = year `mod` 4 == 0 && (year `mod` 100 /= 0 || year `mod` 400 == 0)
    
    getMaxDays :: Year -> Month -> Int
    getMaxDays _ January = 31
    
    getMaxDays year February
        | isLeapYear year = 29
        | otherwise = 28
    
    getMaxDays _ March = 31
    getMaxDays _ April = 30
    getMaxDays _ May = 31
    getMaxDays _ June = 30
    getMaxDays _ July = 31
    getMaxDays _ August = 31
    getMaxDays _ September = 30
    getMaxDays _ October = 31
    getMaxDays _ November = 30
    getMaxDays _ December = 31
    

    关于haskell 枚举 - 如果值构造函数需要值而不是空值,该怎么办?给出需求场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11661878/

    相关文章:

    haskell - 不将类型识别为转换器堆栈中 monad 的关联类型

    java - 使用 Java 在 SQLite 中存储和检索枚举

    java - 如何强制属性等于常量值之一(在 Java 中)?

    arrays - 派生类型数组 : select entry

    list - 如何从 stdin 读取 haskell 中单独一行上的每个整数来初始化整数列表?

    haskell - 带镜头和 zipper 的遍历树

    haskell - 如何使用 vim :split to open ghci and a Haskell file?

    enums - 为特定变体派生特征

    haskell - Haskell 中的推导是如何进行的?

    io - 写语句不能在派生类型的用户定义格式化 I/O 过程中生成新行