我們給出了我們的分配數據結構如下:哈斯克爾漂亮的打印表達結構?
-- Question 2: Expression tree.
data Expr
= Lit Float
| Add Expr Expr
| Sub Expr Expr
| Mul Expr Expr
| Div Expr Expr
| X
這代表一個浮點值,加/子/ MUL /兩子樹格,或代表一個X一個未知的變量。我們必須編寫一個能夠很好地打印樹的方法。這是我到目前爲止有:
draw :: Expr -> Int -> String
draw (Lit f) _ = show f
draw (X) _ = "X"
draw (Add a b) lvl = indent lvl ++ "(+) ---" ++ draw a (lvl+1) ++ "\n" ++ indent lvl ++ "|\n" ++ indent lvl ++ "---" ++ draw b (lvl+1)
draw (Sub a b) lvl = indent lvl ++ "(-) ---" ++ draw a (lvl+1) ++ "\n" ++ indent lvl ++ "|\n" ++ indent lvl ++ "---" ++ draw b (lvl+1)
draw (Mul a b) lvl = indent lvl ++ "(*) ---" ++ draw a (lvl+1) ++ "\n" ++ indent lvl ++ "|\n" ++ indent lvl ++ "---" ++ draw b (lvl+1)
draw (Div a b) lvl = indent lvl ++ "(/) ---" ++ draw a (lvl+1) ++ "\n" ++ indent lvl ++ "|\n" ++ indent lvl ++ "---" ++ draw b (lvl+1)
indent :: Int -> [Char]
indent 0 = []
indent n = "\t"++indent (n-1)
這適用於簡單的樹:
myE2 :: Expr
myE2 = Add (Lit 4) (Sub (Lit 4) (Lit 2))
打印出爲:
*Main> putStr(draw myE2 0)
(+) ---4.0
|
--- (-) ---4.0
|
---2.0
這是我預期的,但是,更復雜的樹如:
myExpr :: Expr
myExpr = (Add (Add (Sub (Mul (Lit 4) (X)) (Lit 1)) (Lit 4)) (Lit 6))
打印爲:
*Main> putStr(draw myExpr 0)
(+) --- (+) --- (-) --- (*) ---4.0
|
---X
|
---1.0
|
---4.0
|
---6.0
任何人都可以提供有關如何解決此問題的建議嗎?
一個簡單的選擇:使用'unfoldTree'函數將'Expr'轉換成標準'Data.Tree',然後調用'drawTree'函數。 –
這是一項家庭作業;我們不允許使用它。 –
如果它不需要以這種格式進行漂亮的打印,您可能會喜歡[以前的類似問題](http://stackoverflow.com/q/20406722/791604)關於最小化加上漂亮打印的表單的方法。 –