Haskell 哈斯克尔的哈夫曼树

Haskell 哈斯克尔的哈夫曼树,haskell,tree,huffman-code,Haskell,Tree,Huffman Code,我在哈斯凯尔是个新手,我正在尝试创建一棵哈夫曼树,直到最后我才知道该怎么做 我对树的定义如下:data HuffTree=Node Int HuffTree HuffTree | Leaf(Int,Char) 到目前为止,我有一个函数insTree::HuffTree->HuffTree->HuffTree,它在树中插入一个节点及其子树并返回新树。一种函数makePair::HuffTree->HuffTree->HuffTree,它接受两棵树,并生成一棵新树,其中原始两棵树作为子树,前两棵树中

我在哈斯凯尔是个新手,我正在尝试创建一棵哈夫曼树,直到最后我才知道该怎么做

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

你能告诉我如何解决这个问题吗?

合并的结果是什么类型的

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

merge(t1:t2:tree)=insTree(makePair t1 t2)tree
无论如何都是荒谬的,因为
tree
是一个列表,
insTree
应该是一个
HuffTree
,而不是一个列表

我不熟悉哈夫曼树构建算法。但我认为:

  • 这里显然不需要合并[]=[],因为没有与空列表对应的有效树
  • merge[t]
    应返回
    t
    。我不能肯定这一点,但我只是按照类型
  • merge(t1:t2:tree)
    应该返回
    insTree(makePair t1 t2)(merge tree)
    。我又在学这些类型了。如果您对此感到困惑,请记住,在模式
    (a:b:cs)
    中,只有
    a
    b
    是列表的元素
    cs
    是列表的其余部分,这只是另一个列表


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

合并的结果是什么类型的

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

merge(t1:t2:tree)=insTree(makePair t1 t2)tree
无论如何都是荒谬的,因为
tree
是一个列表,
insTree
应该是一个
HuffTree
,而不是一个列表

我不熟悉哈夫曼树构建算法。但我认为:

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


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

你能发布insTree和makePair函数吗?你能发布insTree和makePair函数吗?我解决了。问题是insTree函数。谢谢你的回答。我解决了它问题是insTree函数。谢谢你的回答。