在Haskell中使用Data.Heap,或者为初学者阅读Haskell文档

时间:2010-04-15 06:31:33

标签: api data-structures haskell

我正在尝试使用Haskells Data.Heap模块,但我甚至无法使用整数。我能够使用的唯一堆是“空”,不带任何参数。

稍后我将弄清楚如何满足我的需求,但是现在如果我能用数字测试它,我会很高兴。

1 个答案:

答案 0 :(得分:15)

Haskell中的数据结构库通常提供fromList函数来从列表转换为该结构。 Data.Heap也不例外。但是在尝试使用它时会遇到一些疯狂的错误:

Prelude Data.Heap> Data.Heap.fromList [1,2,5,7]

<interactive>:1:0:
    Ambiguous type variables `t', `pol' in the constraint:
      `HeapItem pol t'
        arising from a use of `fromList' at <interactive>:1:0-27
    Probable fix: add a type signature that fixes these type variable(s)

....

这里的要点是不明确的类型。有几种类型的堆,例如MaxHeap和MinHeap,只能通过调用fromList来推断。您需要通过类型签名告诉Haskell您正在使用哪种堆:

Prelude Data.Heap> Data.Heap.fromList [1,2,5,7] :: MinHeap Int
fromList [(1,()),(2,()),(5,()),(7,())]

其他构造函数,例如singletonfromAscList等运作方式类似。

构建堆后,其余的很容易,例如将项目插入堆

Prelude Data.Heap> let heap = Data.Heap.fromList [1,2,5,7] :: MinHeap Int
Prelude Data.Heap> heap
fromList [(1,()),(2,()),(5,()),(7,())]
Prelude Data.Heap> Data.Heap.insert 3 heap
fromList [(1,()),(3,()),(2,()),(5,()),(7,())]

阅读堆顶部

Prelude Data.Heap> heap
fromList [(1,()),(2,()),(5,()),(7,())]
Prelude Data.Heap> viewHead heap
Just 1