我正在使用
类型data J = JObj[(String, J)]
| JArr[J]
| JStr String
给出输入时:
JObj[("problem", "solving")]
我希望输出为:
{"problem":"solving"}
但是由于JStr是一个列表,它会不断打印{["problem", "solving"]}
这是JStr在上面指定的方式,但不是我想要的。
这就是我所拥有的:
show(JStr x) = show x
show(JObj x) = "{" ++ show (foldl (x)) ++ "}"
show(JArr x) = show x
我相信我可以在列表中使用map / fold(我的实现是错误的?),但我对如何继续进行感到困惑。 我还想过使用插入&穿插在Data.List中来解决这个问题。 Thnks
答案 0 :(得分:2)
考虑手头的语法。对于(String, J)
列表中的任何一对JObj
,我们希望最终看到(s, j)
成为"s": j
jpair :: (String, J) -> String
jpair (s, j) = show s ++ " : " ++ show j
现在,如果我们有一个列表[(String, J)]
,那么我们可以生成一个"s": j
字符串片段的列表,但我们需要通过散布逗号来组合它们,而不是滥用Haskell列表语法,其中包括[
和]
括号。
此功能在Data.List.intersperse
intersperse :: a -> [a] -> [a]
或者更好,在Data.List.intercalate
intercalate :: [a] -> [[a]] -> [a]
intercalate med = concat . intersperse med
我们可以使用intercalate
来获取我们想要的内容
instance Show J where
show(JStr x) = show x
show(JObj x) = "{" ++ intercalate "," (map jpair x) ++ "}"
show(JArr x) = show x