Haskell在列表上显示实例

时间:2017-11-18 20:10:32

标签: haskell data-structures instance

我在向我的数据结构添加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"  
    []]  

所以,我不需要括号,逗号和引号。有任何想法吗?感谢

3 个答案:

答案 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]

它还附带drawTreedrawForest函数,这些函数大致就是您自己编写的函数。

> :m + Data.Tree
> let t = Node "strct" [Node "strct1" [], Node "strct2" [], Node "strct3" []]
> putStr . drawTree $ t
strct
|
+- strct1
|
+- strct2
|
`- strct3