我正在尝试使用Haskells Data.Heap模块,但我甚至无法使用整数。我能够使用的唯一堆是“空”,不带任何参数。
稍后我将弄清楚如何满足我的需求,但是现在如果我能用数字测试它,我会很高兴。
答案 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,())]
其他构造函数,例如singleton
,fromAscList
等运作方式类似。
构建堆后,其余的很容易,例如将项目插入堆
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
等