1

如果我有一个包含列表的数据类型,那么想要以 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}

有没有人看到问题?

4

3 回答 3

6

我想你只需要这个:

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.

于 2013-03-10T04:06:44.020 回答
2

的构造函数Mlist a被调用Mlist,所以写它而不是mlist在你的模式匹配中。同样,没有MList定义,所以也修复它。

此外,它是Mlist a,不是Mlist,是 的一个实例Show,并且仅当a是 时。所以你要instance (Show a) => Show (Mlist a) where ...

于 2013-03-10T03:44:56.077 回答
0

让我们查阅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的答案是正确的。

于 2013-03-10T03:48:26.967 回答