2015-12-02 6 views
4

Я хочу написать функцию toTree, которая преобразует список значений в виде двоичного дерева:Haskell Нет экземпляр, вытекающий из использования «печати»

data Tree a = Leaf | Branch a (Tree a) (Tree a) 
tree = Branch 6 (Branch 3 Leaf Leaf) (Branch 9 Leaf Leaf) 

split :: [a] -> ([a], [a]) 
split lst = splitAt (((length lst) + 1) `div` 2) lst 
toTree :: [a] -> Tree a 
toTree (x: xs) = Branch x (toTree xm) (toTree xl) where (xm, xl) = split xs 
toTree [] = Leaf 

Я не могу понять, почему я получаю эту ошибку на toTree [1,2,3]

No instance for (Show (Tree a0)) arising from a use of `print' 
In the first argument of `print', namely `it' 
In a stmt of an interactive GHCi command: print it 

Я знаю, что это простая ошибка для исправления, но я не могу найти, что вызывает ее. Как я могу решить эту проблему?

ответ

6

просто добавить

data Tree a = Leaf | Branch a (Tree a) (Tree a) 
      deriving Show 

ошибка просто говорит, что Haskell не знает, как показать значение типа Tree a0 (print использует show от типа класса Show)

а также Самый простой способ - автоматически вывести его

Или вы должны реализовать его самостоятельно, используя что-то вроде этого:

instance (Show a) => Show (Tree a) where 
    show Leaf = "leaf" 
    show (Branch v l r) = "(left: " ++ show l ++ ") " ++ show v ++ " (right: " ++ show r ++ ")" 

, где я только что сделал что-то, чтобы дать вам что-то вроде этого:

λ> toTree [1,2,3] 
(left: (left: leaf) 2 (right: leaf)) 1 (right: (left: leaf) 3 (right: leaf)) 
+0

Ok спасибо за помощь мне. Я все еще новичок в языке. – donth77

+0

нет проблем - продолжайте идти, это того стоит - кстати: это такая незначительная деталь - остальная часть вашего кода работает в конце концов;) – Carsten

+0

как я могу напечатать 'Leaf' в одиночку? – zhirzh