2015-01-31 251 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