我選擇了圍繞着JSON對象和wl-pprint-annotated這個問題(here is the paper behind that library),因爲他們可以很容易地有MVCE,但我的問題是不實際周圍漂亮的印刷只是 JSON對象和對於我使用的漂亮打印庫,我很靈活。漂亮的印刷JavaScript對象
考慮以下簡化的JavaScript對象數據類型:
data Object = Object [(String, Object)]
| String String
如何可以定義一個封裝其輸出到多行以通常的方式相當打印功能?我的意思是:只要可能,合適的打印輸出應該放在一行上。如果這是不可能的,我期望最外層的對象在內層之前開始添加新行。
下面是使用wl-pprint-annotated一個嘗試:
{-# LANGUAGE OverloadedString #-}
import Text.PrettyPrint.Annotated.WL
prettyObject :: Object -> Doc a
prettyObject (String str) = "\"" <> text str <> "\""
prettyObject (Object fields) = Union ("{" <+> hsep fields' <+> "}")
("{" <#> indent 2 (vsep fields') <#> "}")
where
fields' :: [Doc a]
fields' = punctuate "," [ text key <> ":" <+> prettyObject val
| (key,val) <- fields ]
現在,一些測試用例。
ghci> o1 = Object [("key1", String "val1")]
ghci> o2 = Object [("key2", String "val2"), ("looooooooooong key3", String "loooooooooooong val3"),("key4", String "val4")]
ghci> o3 = Object [("key5", String "val5"), ("key6", o2), ("key7", String "val7")]
ghci> prettyObject o1
{ key1: "val1" }
ghci> prettyObject o2
{
key2: "val2",
looooooooooong key3: "loooooooooooong val3",
key4: "val4"
}
ghci> prettyObject o3
{ key5: { key1: "val1" }, key6: {
key2: "val2",
looooooooooong key3: "loooooooooooong val3",
key4: "val4"
}, key7: "val7" }
我想最後的輸出,而不是成爲
{
key5: { key1: "val1" },
key6: {
key2: "val2",
looooooooooong key3: "loooooooooooong val3",
key4: "val4"
},
key7: "val7"
}
我找這在某種程度上與在Haskell現有的漂亮印刷庫選擇一個適合(在現實的解決方案,我漂亮的印刷很多不僅僅是JSON的一個子集)。
我不尋找它定義了prettyObject :: Object -> String
的解決方案 - 這種方法的整個的一點是,Doc
的呈現方式取決於它是在被漂亮的印刷什麼大局。
非常感謝!這真是一個了不起的答案/解釋。 – Alec