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

Mas*_*sse 12 api haskell data-structures

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

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

ken*_*ytm 16

通常,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)

....
Run Code Online (Sandbox Code Playgroud)

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

Prelude Data.Heap> Data.Heap.fromList [1,2,5,7] :: MinHeap Int
fromList [(1,()),(2,()),(5,()),(7,())]
Run Code Online (Sandbox Code Playgroud)

其他构造如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,())]
Run Code Online (Sandbox Code Playgroud)

阅读堆顶部

Prelude Data.Heap> heap
fromList [(1,()),(2,()),(5,()),(7,())]
Prelude Data.Heap> viewHead heap
Just 1
Run Code Online (Sandbox Code Playgroud)

等等