如果我有一个包含列表的数据类型,那么想要以 class 的形式创建它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}
有没有人看到问题?
如果我有一个包含列表的数据类型,那么想要以 class 的形式创建它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}
有没有人看到问题?
我想你只需要这个:
instance Show a => Show (Mlist a) where
show (Mlist xs) = show xs
Show a =>
意味着这将创建Mlist a
一个Show
whena
已经是Show
. 换句话说,Show (Mlist a)
取决于Show a
。
此外,您想显示xs
列表,使用 的现有实例Show [a]
,顺便声明了instance Show a => Show [a] where...
。所以你需要使用show xs
.
的构造函数Mlist a
被调用Mlist
,所以写它而不是mlist
在你的模式匹配中。同样,没有MList
定义,所以也修复它。
此外,它是Mlist a
,不是Mlist
,是 的一个实例Show
,并且仅当a
是 时。所以你要instance (Show a) => Show (Mlist a) where ...
让我们查阅Show
类的定义,现在只使用show
方法:
class Show a where
show :: a -> String
当您编写 时instance Show MList
,您将替换MList
every a
,因此类型签名 forshow
将变为:
show :: MList -> String
啊哈!有问题! MList
不是一个有效的类型,但是MList Char
是,这意味着我们需要修正我们instance
的说法:
instance Show (MList Char) where ...
show (Mlist xs) = xs
编辑:这是不正确的,因为它Int
不像您要求的那样处理 s 。 gspr
的答案是正确的。