如何用foldr为自定义List类型编写无末尾逗号的Show实例?
解决自定义Show实例末尾多余逗号的问题
你的问题出在foldr的拼接逻辑上:每个元素都会追加, 再连接后续内容,最后把"}"作为初始值,导致最后一个元素后面会多出一个逗号。这里有几种简便的解决方法:
方法1:使用intercalate(推荐)
借助Data.List里的intercalate函数,它可以自动用指定分隔符连接列表元素,不会产生末尾多余的分隔符:
import Data.List (intercalate) instance Show a => Show (Mylist1 a) where show (Mylist1 []) = "{}" show (Mylist1 xs) = "{" ++ intercalate ", " (map show xs) ++ "}"
先把列表里的每个元素转换成字符串,再用, 连接起来,最后包裹大括号即可。
方法2:使用foldr1替代foldr
针对非空列表,用foldr1来拼接元素,它会以最后一个元素作为初始值,避免末尾的逗号:
instance Show a => Show (Mylist1 a) where show (Mylist1 []) = "{}" show (Mylist1 xs) = "{" ++ foldr1 (\x y -> show x ++ ", " ++ y) (map show xs) ++ "}"
foldr1会遍历列表,将相邻元素用指定逻辑拼接,最后一个元素后面不会额外添加逗号。
方法3:模式匹配拆分首元素与剩余元素
通过模式匹配把非空列表拆成首元素和剩余部分,单独处理首元素,剩余元素前加分隔符:
instance Show a => Show (Mylist1 a) where show (Mylist1 []) = "{}" show (Mylist1 (x:xs)) = "{" ++ show x ++ foldr (\y acc -> ", " ++ show y ++ acc) "" xs ++ "}"
首元素直接输出,剩余每个元素前追加, ,这样自然不会出现末尾多余的逗号。
内容的提问来源于stack exchange,提问作者Io12
相关产品推荐
相关产品推荐

