2017-11-18 1 views
1

イムをインスタンスを示し、ウィッヒは次のとおりです。Haskellは私のデータ構造にショーのインスタンスを追加することで問題を抱えてリストに

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

だから私はすべての構造は、1つのレベルをより深くインデントする必要がありますか? – HuStmpHrrr

+1

私はそうではありません!しかし、私の先生は、私はそれをこのようにコード化する必要があると私に言った... @ReinHenrichs –

答えて

1

これは良いライブラリルーチンがあると確信していますが、この作品はありませんか?

unlines $ a : [" " ++ show x | x <- xs] 

ただし、これには1つのレベルしか含まれていません。インデントを維持するためにshowとは別の関数を定義するか、インデントを挿入する場所を見つけるためにサブフリーを分割してlinesに分割しておく必要があります。

なインデントの挿入機能のラフ案は次のとおりです。

prefix p s = unlines [p ++ l | l <- lines s] 

繰り返しますが、私は図書館でもっと良いものがあると確信しています。これらの短いスニペットでも、いくつかの洗練されたスニペット(foldl1 (++) - >concat - >unlines)が最初の行に先頭に:という形で結合しています。

+0

それは動作します、ありがとう!ただし、各構造の最後に新しい行が追加されます。あなたはそれをどうやって修正できるのか考えていますか? –

+0

最初の(愚かな)考え: 'init'を使って最後の文字を切り捨てますか? –

+0

2番目の考え: 'unlines'は本質的に' concatMap(++ "\ n") 'です。最後の '\ n'は' foldl1(\ a b - > a ++ "\ n" ++ b) 'でスキップすることができます。もちろん、[intercalate] \ n "'(https://www.haskell.org/hoogle/?hoogle=intercalate)のように読みやすいでしょう。 –

3

基本的に1つの簿記だけが行なわれ、インデントレベルのトラクトを維持する。累積カウンタは間違いなく役に立ちます:

pretty' :: Int -> Structure -> [String] 
pretty' level (Structure s list) = ((concat $ replicate level " ") ++ s) : 
    (list >>= (pretty' (level + 1))) 

この関数は、きれいなプリンタのアキュムレータを定義します。残りの部分は、それをラップすることです:

pretty = pretty' 0 
prettyShow = unlines . pretty 

それは間違いなく私がbaseが付属していますData.Treeモジュールを使用することをお勧めし

Prelude> putStrLn $ prettyShow (Structure "a" [Structure "b" [Structure "c" []], Structure "d" []]) 
a 
    b 
     c 
    d 
+0

私はちょうど変態の議論の一部が間違っていることに気づいたので、私はそれを削除しました。再帰は異種でなければならない。残りの部分は働いており、OPの質問に答えるのに十分なはずです。 – HuStmpHrrr

0

に動作します。また、大体あなたが書くしようとしていたものですdrawTreedrawForest機能が付属しています

data Tree a = Node {rootLabel :: a, subForest :: Forest a} 
type Forest a = [Tree a] 

:それはリストは型シノニムで行くことを除いて、あなたと同じ構造を持つジェネリック(バラ)の木ですあなた自身。

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