如何"显示"用户定义的数据类型"设置"在哈斯克尔?

时间:2015-03-20 17:27:06

标签: haskell set custom-data-type

如果我已经定义了类似的设置数据类型:

data Set a = Set [a]

集合的例子:

  • empty = Set []
  • s = Set [1,23]

我想创建一个show实例来显示这样的集合: {1,23}而不是[1,23]

我该怎么做呢? 到目前为止,我尝试过类似的东西:

instance (Show a) => Show (Set a) where 
show (Set a) = "{" ++ show a ++ "}"

但这不起作用,因为它给了我{[1,23]}

甚至可以做这样的事情吗?

1 个答案:

答案 0 :(得分:2)

首先:你可能在你自己的代码中有它:类型名称和构造函数必须是大写的。

data Set a = Set [a]

第二:Show课程并不适合这种漂亮的印刷。通常,用户希望其输出是有效的Haskell代码。 {1,2,3}无效Haskell。

总之...

最简单的解决方案是使用Show实例作为基础列表类型,就像您一样,但删除前导[并尾随]

trimOuterBrackets :: String -> String
trimOuterBrackets ('[':s)
                | (']':s') <- reverse s  = reverse s'
trimOuterBrackets s = s

但请注意,这不会可靠,至少不适用于字符:​​show $ Set ['b','l','a']会产生{"bla"},因为字符串也是列表shown differently

因此,您最好自己定义功能。正如bheklilr所说,它可以用intercalate来完成:这需要一个字符串列表和另一个用于将这些字符串“粘合”在一起的字符串。可以通过map show函数获取字符串列表...

我认为这应该是足够的提示。