eaz*_*001 5 haskell types functional-programming
我有一段代码,我已经声明了两种数据类型.我已经自动派生为类型类的成员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
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有更整洁,更少冗余的写作方式?换句话说,我写了两个几乎相同的实例,数据类型名称(WeekDay vs. Month)是唯一更改的变量.
Ing*_*ngo 11
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
Run Code Online (Sandbox Code Playgroud)
我想以Ingo的答案为基础,指出您实际上根本不需要定义类型类。您可以定义以下函数而无需调用任何其他类型类:
next :: (Eq a, Bounded a, Enum a) => a -> a
next a = if a == maxBound then minBound else succ a
Run Code Online (Sandbox Code Playgroud)
现在,您不必instance Circ为所有类型都声明。