Haskell:创建Show的实例

ice*_*man 1 haskell deriving

在下面的代码中,我定义了一个代数数据类型,我(尝试)使它成为Show的一个实例.但是,我遇到了编译时错误(包含在下面).我究竟做错了什么?

我相信我正在使用正确的语法(至少按照这篇文章).对于上下文,我正在'99 Haskell问题'中解决问题#13

data RepeatType a = Multiple (Int, a) | Single a

instance Show RepeatType where
  show (Multiple (n,x)) = "(" ++ n ++ " " ++ show x ++ ")"
  show (Single x)       = show x
Run Code Online (Sandbox Code Playgroud)

我收到以下编译时错误:

test.hs:3:15:
    Expecting one more argument to `RepeatType'
    In the instance declaration for `Show RepeatType'
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

例如,目标是在GHCi中按如下方式工作:

ghci> Multiple (5,'C')
(5 C)
ghci> Single 'D'
D
Run Code Online (Sandbox Code Playgroud)

编辑:对不起完全不相关的帖子标题 - 现在改了.

fjh*_*fjh 11

你的问题是它RepeatType本身并不是一个类型,它是一个类型构造函数.Show只能为"适当"类型实例化,例如RepeatType a.但是,为了实现这个目的,你需要承诺它a本身就是一个实例Show,所以你最终会得到这样的东西:

instance (Show a) => Show (RepeatType a) where
  show (Multiple (n,x)) = "(" ++ show n ++ " " ++ show x ++ ")"
  show (Single x)       = show x
Run Code Online (Sandbox Code Playgroud)

(注意:您还需要调用shown的定义的第一部分,因为你不能连接类型为int和字符串.)