Haskell:创建Show的实例

时间:2014-10-21 17:00:49

标签: haskell deriving

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

我相信我使用了正确的语法(至少按this post)。对于上下文,我正在工作Problem #13 in '99 Haskell Problems'

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

instance Show RepeatType where
  show (Multiple (n,x)) = "(" ++ n ++ " " ++ show x ++ ")"
  show (Single x)       = show x

我收到以下编译时错误:

test.hs:3:15:
    Expecting one more argument to `RepeatType'
    In the instance declaration for `Show RepeatType'
Failed, modules loaded: none.

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

ghci> Multiple (5,'C')
(5 C)
ghci> Single 'D'
D
编辑:对不起完全不相关的帖子标题 - 现在改了。

1 个答案:

答案 0 :(得分: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

(注意:您还需要在定义的第一部分中调用show上的n,因为您无法连接Ints和字符串。)