在下面的代码中,我定义了一个代数数据类型,我(尝试)使它成为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)
(注意:您还需要调用show上n的定义的第一部分,因为你不能连接类型为int和字符串.)