如何在Haskell中设置类实例?

时间:2013-03-10 03:41:14

标签: haskell

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

有没有人看到这个问题?

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

编辑:这是不正确的,因为它不像你要求的那样处理Intgspr的答案是对的。