如果我已经定义了类似的设置数据类型:
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]}
甚至可以做这样的事情吗?
答案 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
函数获取字符串列表...
我认为这应该是足够的提示。