制作"循环"枚举类型类的实例的冗余方法较少

 河南华萃酒业_359 发布于 2023-02-13 18:21

我有一段代码,我已经声明了两种数据类型.我已经自动派生为类型类的成员enum,但是,我不喜欢它们不是"循环".通过这个,我的意思是召唤succ Sun应该让我受益Mon.succ Dec应该导致Jan.所以我没有写自己的枚举,而是这样做:

data WeekDay = Mon | Tue | Wed | Thu | Fri | Sat | Sun
             deriving (Enum, Show, Eq, Bounded)

data Month = Jan | Feb | Mar | Apr | May | Jun | July | Aug | Sep | Oct | Nov 
             | Dec
           deriving (Enum, Show, Eq, Bounded)

class Circ a where
  next :: Enum a => a -> a

instance Circ WeekDay where
  next a = if a == maxBound then minBound else succ a

instance Circ Month where      -- this is nearly identical to the one above
  next a = if a == maxBound then minBound else succ a

我的问题是:是否有更整洁,更少冗余的写作方式?换句话说,我写了两个几乎相同的实例,数据类型名称(WeekDay vs. Month)是唯一更改的变量.

2 个回答
  • class (Enum a, Bounded a, Eq a) => Circ a where
         next :: a -> a
         next a = if a == maxBound then minBound else succ a
    
    instance Circ WeekDay
    instance Circ Month
    

    2023-02-13 18:22 回答
  • 我想以Ingo的答案为基础,指出您实际上根本不需要定义类型类。您可以定义以下函数而无需调用任何其他类型类:

    next :: (Eq a, Bounded a, Enum a) => a -> a
    next a = if a == maxBound then minBound else succ a
    

    现在,您不必instance Circ为所有类型都声明。

    2023-02-13 18:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有