Haskell自定义SetList类型的Show实例实现问题(需用fold)
解决SetList Show实例的末尾逗号问题(基于fold实现)
你的问题核心是当前foldr的写法会给每个元素后都添加, ,包括最后一个元素,导致末尾多出逗号。以下是几种用fold系列函数实现的正确写法:
方法1:通过foldr判断后续字符串
修改func函数,当后续字符串是"}"时(也就是处理最后一个元素时),不再添加逗号:
instance Show a => Show (SetList a) where show (Set xs) = "{" ++ foldr func "}" xs where func x y = show x ++ (if y == "}" then "" else ", ") ++ y
原理:最后一个元素对应的y就是初始值"}",此时跳过逗号拼接;其他元素的y是后续元素拼接后的字符串,正常添加逗号。
方法2:先转字符串列表再foldr合并
先把集合元素都转为字符串,再用foldr处理分隔逻辑,避免末尾逗号:
instance Show a => Show (SetList a) where show (Set xs) = "{" ++ foldr combine "" (map show xs) ++ "}" where combine s "" = s -- 处理最后一个元素,后面无内容直接返回 combine s rest = s ++ ", " ++ rest -- 前面的元素添加逗号和后续内容
原理:map show xs把每个元素转成字符串,foldr从右往左合并,当rest为空时说明是最后一个字符串,不需要加逗号。
方法3:用foldr1处理非空列表
空列表单独返回"{}",非空列表用foldr1(专门处理非空列表的fold)来拼接,避免末尾逗号:
instance Show a => Show (SetList a) where show (Set []) = "{}" show (Set xs) = "{" ++ foldr1 (\x y -> show x ++ ", " ++ y) xs ++ "}"
原理:foldr1会把列表的最后一个元素作为初始值,前面的每个元素都和后续拼接结果加上逗号,自然不会在末尾多出逗号。
以上三种方法都符合练习要求的fold系列函数使用,且能正确输出{1, 2, 3, 4, 5}这类格式。
内容的提问来源于stack exchange,提问作者immi0815
相关产品推荐
相关产品推荐

