Haskell函数 - 下一个用于枚举

bas*_*354 1 enums haskell next

我有一个枚举和一个函数来调用枚举的下一个元素.

data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
next :: Day -> Day
next Mon = Tue
next Tue = Wed
next Wed = Thu
next Thu = Fri
next Fri = Sat
next Sat = Sun
next Sun = Mon
Run Code Online (Sandbox Code Playgroud)

我尝试通过调用:

> next Mon 
Run Code Online (Sandbox Code Playgroud)

但编译器显示错误:

<interactive>:35:1:
    No instance for (Show Day) arising from a use of `print'
    Possible fix: add an instance declaration for (Show Day)
    In a stmt of an interactive GHCi command: print it
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Lee*_*Lee 9

除了实现之外Show,如果实现,Enum您可以next使用succ以下方法简化您的功能:

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

next :: Day -> Day
next Sun = Mon
next d = succ d
Run Code Online (Sandbox Code Playgroud)

您可以next使用Bounded以下环绕行为制作更通用的版本:

next :: (Eq a, Enum a, Bounded a) => a -> a
next e | e == maxBound = minBound
       | otherwise = succ e

data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving (Eq, Show, Enum, Bounded)
Run Code Online (Sandbox Code Playgroud)