我在向我的数据结构添加show实例时遇到了问题,具体是:
data Structure = Structure String [Structure]
我希望得到这个输出:
strct
strct1
strct2
strct3
我一直在尝试这个
instance Show Structure where
show (Structure a (xs)) = show a ++ "\n" ++ " " ++ show xs
但它的输出是
"strct"
["strct1"
[], "strct2"
[]]
所以,我不需要括号,逗号和引号。有任何想法吗?感谢
答案 0 :(得分:3)
基本上只有一个簿记要做,即保持缩进级别。累积计数器肯定有帮助:
@SerializedName("id")
String productId;
此功能定义了漂亮的打印机的累加器。剩下的部分是包装它:
pretty' :: Int -> Structure -> [String]
pretty' level (Structure s list) = ((concat $ replicate level " ") ++ s) :
(list >>= (pretty' (level + 1)))
绝对有效
pretty = pretty' 0
prettyShow = unlines . pretty
答案 1 :(得分:1)
我确信有更好的库例程,但这不会起作用吗?
unlines $ a : [" " ++ show x | x <- xs]
但是,这仅涵盖一个级别。您可能希望定义一个与show不同的函数来维护缩进,或者您必须继续使用lines
拆分子展示以找到缩进的位置。
这种缩进插入功能的草稿是:
prefix p s = unlines [p ++ l | l <- lines s]
同样,我确信图书馆里有更好的东西。即使是这些简短的片段也经历了几个细化步骤(foldl1 (++)
- &gt; concat
- &gt; unlines
,然后加入第一行作为:
的头部。
答案 2 :(得分:0)
我建议使用Data.Tree
附带的base
模块。它是一个通用(玫瑰)树,其结构与您的相同,只是列表的类型是同义词:
data Tree a = Node {rootLabel :: a, subForest :: Forest a}
type Forest a = [Tree a]
它还附带drawTree
和drawForest
函数,这些函数大致就是您自己编写的函数。
> :m + Data.Tree
> let t = Node "strct" [Node "strct1" [], Node "strct2" [], Node "strct3" []]
> putStr . drawTree $ t
strct
|
+- strct1
|
+- strct2
|
`- strct3