2013-04-07 3 views
1

저는 하스켈에서 정말로 새로 왔고 하프만 트리를 만들려고 노력하고 있습니다. 나무에 대한Haskell Tree in Haskell

내 정의는 다음과 같습니다

data HuffTree = Node Int HuffTree HuffTree | Leaf (Int, Char) 지금까지, 나는 그것이 트리에서 하위 트리의 새로운 트리를 반환으로 노드를 삽입하는 기능 insTree :: HuffTree -> HuffTree -> HuffTree 있습니다. makePair :: HuffTree -> HuffTree -> HuffTree 함수는 두 개의 트리를 가져 와서 원래의 두 트리를 하위 트리로 가지며 처음 두 트리의 값 합계를 값으로 갖는 새 트리를 만듭니다. 각 노드에서 값을 반환하는 함수 value :: HuffTree -> Int이 있습니다.

makeHuffTree :: [(Int, Char)] -> HuffTree 
makeHuffTree lst = merge leafList 
    where 
     leafList = map (\ ((x,c)) -> Leaf (x,c)) lst 
     merge [] = [] 
     merge [t] = [t] 
     merge (t1 : t2 : tree) = insTree (makePair t1 t2) tree 

나는 그것이이 기능에 문제가 알고 있지만 나는 그것을 처리하는 방법을 알고하지 않습니다

내 문제는 다음과 같습니다 기능 makeHuffTree :: [(Int, Char)] -> HuffTree 함께. 오류는 다음과 같습니다.

Couldn't match expected type `[a0]' with actual type `HuffTree' 
In the return type of a call of `insTree' 
In the expression: insTree (makePair t1 t2) tree 
In an equation for `merge': 
    merge (t1 : t2 : tree) = insTree (makePair t1 t2) tree 

이 문제를 해결하는 방법에 대한 힌트를 제공해 줄 수 있습니까?

+1

insTree 및 makePair 함수를 게시 할 수 있습니까? –

답변

7

merge의 결과는 무엇입니까?

HuffTree 인 경우 merge [t] = [t] 행이 터무니 없습니다. 그렇지 않다면 makeHuffTree lst = merge leafList 라인이 터무니 없습니다. tree가리스트와 insTreeHuffTree 아닌 목록 걸릴하도록되어 있기 때문에

라인 merge (t1 : t2 : tree) = insTree (makePair t1 t2) tree 터무니 중 하나 방법입니다.

허프만 트리 작성 알고리즘에 익숙하지 않습니다. 하지만 다음과 같이 생각합니다.

  • merge [] = [] 빈 목록에 해당하는 유효한 트리가 없기 때문에 여기서는 분명히 필요하지 않습니다.
  • merge [t]t을 반환해야합니다. 나는 그것에 대해 확신 할 수는 없지만, 나는 그 유형들을 단지 따르고있다.
  • merge (t1 : t2 : tree)insTree (makePair t1 t2) (merge tree)을 반환해야합니다. 나는 유형을 다시 따르고 있습니다. 혼란 스럽다면, (a:b:cs) 패턴에서 ab만이 목록의 요소임을 기억하십시오. cs은 목록의 나머지 부분이며 다른 목록입니다.

내 요점은 다음과 같습니다 항상 유형을 따릅니다. 어떤 식 으로든 손가락으로 가리키고 "아하, 너 T 타입이야!"라고 말할 수 있어야합니다. 그리고 그 표현을 취하는 함수에 손가락을 대고 "이 도대체 당신은이 타입의 인수를 가질 수 없습니다!"라고 비난하면서 말 할 수 있습니다. (by by, 컴파일러는 보통 여러분에게 긴 손가락은 도움이되는 오류 메시지 에서처럼). 그리고 다음 당신은 "내가 처분 할 때 내게 필요한 타입의 값을 에서 값으로 만들기 위해 무엇을해야합니까?"라고 말하면 문제의 원인을 수정하는 데 올바른 기능을 적용합니다. 오, 그리고 당신이 적당한 기능을 가지고 있지 않다면, 당신은 하나를 씁니다.

+0

나는 그것을 해결했다. 문제는 insTree 함수입니다. 답변 주셔서 감사합니다. – pixie