2014-12-07 4 views
0

Я изучаю haskell, и я хочу напечатать все узлы в дереве (в зависимости от высоты на дереве, где height = 0 => leafs). И я думаю, что создаю хорошую функцию, но у меня проблема с функцией show.Haskell Tree - Показать экземпляр

data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show) 

tree4 = Node 1 (Node 2 Empty (Node 0 Empty Empty)) (Node 4 Empty Empty) 
tree5 = Empty 

heightTree::Tree a -> Integer 
heightTree Empty = 0 
heightTree (Node x l r) = 1 + max (heightTree l) (heightTree r) 

treeLev::Tree a -> Integer -> [a] 
treeLev Empty a = [] 
treeLev (Node x l r) a = if a == heightTree l || a == heightTree r then [x] else treeLev l (a-1) ++ treeLev r (a-1) 

и когда я использую

*Main> treeLev tree4 

<interactive>:105:1: 
    No instance for (Show (Integer -> [Integer])) 
     arising from a use of `print' 
    Possible fix: 
     add an instance declaration for (Show (Integer -> [Integer])) 
    In a stmt of an interactive GHCi command: print it 
*Main> 

Может кто-нибудь объяснить, что я делаю неправильно? :)

+1

'treeLev' получает два аргумента. Поэтому 'treeLev tree4' является функцией. Вы не можете печатать функции. – user3237465

ответ

2

Сообщение об ошибке, которое вы сообщаете, не говорит вам, что вы не можете распечатать дерево, оно говорит вам, что вы пытаетесь распечатать функцию, и она не может этого сделать.

Вы не указали нам строку с show или print, поэтому мы не можем понять, как ее исправить, но это то, что сообщение мне сообщает.

+0

У меня нет линии с показом или печатью. Я просто компилирую с помощью ghci и тестовой функции в консоли. – pkruk

+2

@neptyd Линия, которая является печатью, является той, которую вы пытаетесь оценить в GHCi. Всякий раз, когда вы выполняете выражение в GHCi, перед ним есть неявная 'print', так как в противном случае это будет бесполезно как интерактивная среда. Что вам нужно сделать, это выполнить что-то вроде 'treeLev tree4 x', где' x' - это то, что подходит для Integer. Затем вы будете оценивать это значение типа '[a]', которое может быть напечатано. Функции не могут быть напечатаны в Haskell, потому что это принципиально невыполнимая задача по разным техническим причинам. – bheklilr

+0

большое спасибо :)! – pkruk