2014-12-07 4 views
0

저는 haskell을 배우고 있고 트리의 모든 노드를 인쇄하려고합니다 (높이 = 0 => 리프가있는 트리의 높이에 따라 다름). 그리고 생각, 내가 좋은 기능을 만들지 만, 나는 쇼 기능에 문제가 있습니다.하스켈 트리 - 인스턴스보기

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]'유형의 값으로 평가하게 될 것입니다. 하스켈에서는 모든 종류의 기술적 인 이유로 기본적으로 불가능한 작업이기 때문에 함수를 출력 할 수 없습니다. – bheklilr

+0

고맙습니다 :)! – pkruk