在下面的代码中,我定义了一个代数数据类型,并且我(尝试)使它成为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
编辑:对不起完全不相关的帖子标题 - 现在改了。
答案 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和字符串。)