【问题标题】:Haskell function-next for enums用于枚举的 Haskell 函数-next
【发布时间】:2014-06-22 01:52:58
【问题描述】:

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

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

我尝试通过调用来使用它:

> next Mon 

但编译器显示错误:

<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

我做错了什么?

【问题讨论】:

  • 你的函数没问题,但你正在尝试打印结果,所以你应该添加deriving (Show) at the end of your Day type declaration
  • data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving (Show) 应该可以解决这个问题。

标签: haskell enums next


【解决方案1】:

除了实现Show,如果你实现Enum,你可以使用succ来简化你的next函数:

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

next :: Day -> Day
next Sun = Mon
next d = succ d

您可以使用Bounded 制作具有这种环绕行为的更通用的next 版本:

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)

【讨论】:

    【解决方案2】:

    这是因为 GHCi 不知道如何显示数据类型。您可以通过添加deriving Show 来解决此问题:

    data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving Show
    

    【讨论】:

      【解决方案3】:

      问题是当您在ghci 中尝试时,它想在String 中显示结果。但它不知道如何将其转换为String

      这可以通过以下方式解决:

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

      或者如果您想手动弥补String

      instance Show Day where
        show Mon = "Monday"
        show Tue = "Tuesday"
        show Wed = "Wednesday"
        --  and so on
      

      【讨论】:

        【解决方案4】:

        请注意,您可以简化 next,让 Haskell 为您派生 EnumBounded 实例:

        data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
          deriving (Bounded, Enum, Show)
        
        next :: Day -> Day
        next Sun = Mon
        next x = succ x
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-26
          • 2023-03-30
          • 2013-01-01
          • 2011-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多