2015-01-31 196 views
1

我与该类型JSON打印格式

data J = JObj[(String, J)] 
    | JArr[J] 
    | JStr String 

工作时给出的输入:

JObj[("problem", "solving")] 

我想输出是:

{"problem":"solving"} 

但由于JStr是一个列表,它不断打印出来,这是上面指定的JStr的方式,但是它不断打印出{["problem", "solving"]} 不是我想要的。

以下是我有:

show(JStr x) = show x 
    show(JObj x) = "{" ++ show (foldl (x)) ++ "}" 
    show(JArr x) = show x 

我相信我能在名单上使用地图/倍(是我的错实现?),但我很困惑,如何进一步进行。 我也想过在Data.List中使用intercalate &散布来解决这个问题。 Thrks

+0

所以问题是关于显示“{a:b,c:d}”?您可以将答案标记为解决方案。 – vlastachu 2015-01-31 21:33:38

回答

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

,或者甚至更好,在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