如果我有一个包含列表的数据类型,那么想要以 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一个Showwhena已经是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,您将替换MListevery a,因此类型签名 forshow将变为:
show :: MList -> String
啊哈!有问题! MList不是一个有效的类型,但是MList Char是,这意味着我们需要修正我们instance的说法:
instance Show (MList Char) where ...
show (Mlist xs) = xs
编辑:这是不正确的,因为它Int不像您要求的那样处理 s 。 gspr的答案是正确的。