【问题标题】:Huffman Tree in Haskell哈斯克尔的霍夫曼树
【发布时间】:2013-04-07 22:16:47
【问题描述】:

我真的是 Haskell 的新手,我正在尝试创建一棵 Huffman 树,但直到最后我才弄清楚如何。

我对树的定义如下: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 :: [(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

我知道这是这个功能的问题,但我不知道如何处理它。我得到的错误是这样的:

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

你能给出如何解决这个问题的提示吗?

【问题讨论】:

  • 你能发布 insTree 和 makePair 函数吗?

标签: haskell tree huffman-code


【解决方案1】:

merge 的结果是什么类型的?

如果是HuffTree,那么merge [t] = [t] 行是荒谬的。如果不是,那么makeHuffTree lst = merge leafList 行是荒谬的。

merge (t1 : t2 : tree) = insTree (makePair t1 t2) tree 行无论哪种方式都是荒谬的,因为tree 是一个列表,而insTree 应该采用HuffTree,而不是一个列表。

我不熟悉 Huffman 树构建算法。但我认为:

  • merge [] = [] 这里显然不需要,因为没有对应于空列表的有效树。
  • merge [t] 应该返回 t。我不能确定,但​​我只是关注类型。
  • merge (t1 : t2 : tree) 应该返回 insTree (makePair t1 t2) (merge tree)。我再次关注类型。如果您对此感到困惑,请记住在模式(a:b:cs) 中,只有ab 是列表的元素; cs 是列表的其余部分,它只是另一个列表。

我的观点是:始终遵循类型。你应该能够将手指指向任何表情并说“啊哈,你是 T 型人!”。然后你可以将你的手指指向接受该表达式的函数并指责说:“见鬼,你不能有这种类型的参数!”(顺便说一句,编译器通常很乐意借给你它的一个长手指,就像它在有用的错误消息中所做的那样)。然后然后你想“我有什么可以从那个值中生成所需类型的值?”,应用正确的函数来修复有问题的参数,差不多就是这样。哦,如果你没有任何合适的函数,你写一个。

【讨论】:

  • 我解决了。问题是 insTree 函数。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多