2014-12-07 78 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 2014-12-07 17:11:43

回答

2

你給出的錯誤信息並不是告訴你,你不能打印樹,它告訴你你試圖打印出一個函數,但它不能這樣做。

您沒有向我們展示showprint的行,所以我們無法看到如何解決它,但這是消息告訴我的。

+0

我沒有任何顯示或打印行。我只是用控制檯中的ghci和測試函數進行編譯。 – pkruk 2014-12-07 16:53:33

+2

@neptyd正在打印的行是您正在GHCi中嘗試評估的行。每當你在GHCi中執行一個表達式時,在它前面都會有一個隱式的'print',因爲否則它就會成爲一個無用的交互式環境。你需要做的是執行像'treeLev tree4 x'這樣的'''',其中''''Integer'是合適的。然後你會評估它的值爲'[a]',可以打印。函數不能在Haskell中打印,因爲基於各種技術原因,這基本上是不可能完成的任務。 – bheklilr 2014-12-07 17:17:22

+0

非常感謝:)! – pkruk 2014-12-08 11:22:03