如果我有一个包含列表的数据类型,那么想要在类Show
的立场中进行,我正在尝试这个,但是它给出了一个错误:
data Mlist a = Mlist [a]
m = Mlist [1, 2, 3]
instance Show Mlist where
show (Mlist xs) = xs
-- m should now be {1, 2, 3}
有没有人看到这个问题?
答案 0 :(得分:6)
我想你只需要这个:
instance Show a => Show (Mlist a) where
show (Mlist xs) = show xs
Show a =>
表示当Mlist a
已经是Show
的实例时,这会使a
成为Show
的实例。换句话说,Show (Mlist a)
取决于Show a
。
此外,您希望使用xs
的现有实例显示Show [a]
列表,该实例偶然声明为instance Show a => Show [a] where...
。所以你需要使用show xs
。
答案 1 :(得分:2)
Mlist a
的构造函数名为Mlist
,因此在模式匹配中写下而不是mlist
。同样,没有定义MList
,所以也要修复它。
此外,它是Mlist a
,而不是Mlist
,是Show
的实例,仅在a
时才是instance (Show a) => Show (Mlist a) where ...
。所以你想要{{1}}
答案 2 :(得分:0)
让我们来看一下Show
类的定义,现在只使用show
方法:
class Show a where
show :: a -> String
当您撰写instance Show MList
时,您会将MList
替换为a
,因此show
的类型签名将变为:
show :: MList -> String
啊哈!有问题! MList
不是有效类型,但MList Char
是,这意味着我们需要修改instance
来说明:
instance Show (MList Char) where ...
show (Mlist xs) = xs
编辑:这是不正确的,因为它不像你要求的那样处理Int
。 gspr
的答案是对的。