Демонстрационное дерево экземпляров в haskell - PullRequest
0 голосов
/ 26 мая 2018

Я бы хотел показать функцию show для моего двоичного дерева, построенного следующим образом: data Tree a = Nil | Leaf a | Branch a (Tree a) (Tree a).Я хотел бы получить представление, как "дерево" Unix команды.Например:

Tree example

Функция показа будет выглядеть следующим образом:

> 27
>> 14
>>> 10

>>> 19

>> 35
>>> 31

>>> 42

Я хочу табулировать каждое "поддерево" с помощью рекурсиифункция, но я не знаю, как это мой фактический код:

instance (Show a)=>Show (Tree a) where
show Nil = ""
show (Leaf e) = show e
show (Branch e ls rs) = show e ++ "\n\t" ++ show ls ++ "\n\t" ++ show rs

Итак, вопрос: как я могу реализовать рекурсивную функцию табуляции, потому что каждый раз, когда я использую новую строку и просто табулировать простоодин раз вместо глубины поддерева

1 Ответ

0 голосов
/ 26 мая 2018

Вы можете определить вспомогательную функцию, давайте назовем ее showWithDepth следующим образом:

showWithDepth :: (Show a) => Tree a -> Int -> String
showWithDepth Nil _ = ""
showWithDepth (Leaf e) depth = (replicate depth '\t') ++ show e ++ "\n"
showWithDepth (Branch e ls rs) depth = (replicate depth '\t') ++ show e ++ "\n" ++ showWithDepth ls (depth+1) ++ showWithDepth rs (depth+1)

И теперь мы можем просто определить Ваш экземпляр следующим образом:

instance (Show a)=>Show (Tree a) where
show x = showWithDepth x 0
...