2010-04-15 22 views
7

我正在嘗試使用Haskells Data.Heap模塊,但我甚至無法將它與整數一起使用。我唯一能夠使用的堆是「空」,它沒有任何爭論。在Haskell中使用Data.Heap,或者爲初學者閱讀Haskell文檔

後來我會弄清楚如何爲我的需求提供實例,但現在如果我甚至能夠用數字測試它,我會很高興。

+0

你的問題是頂?你能否提供迄今爲止的代碼,所以SO用戶可以提出改進建議? – 2010-04-15 07:05:58

回答

12

通常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來推斷。你需要告訴哈斯克爾你與類型簽名使用的是哪種堆:

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 

+0

謝謝。這正是我所期待的。我能夠獲得類型錯誤,但無法弄清楚如何擺脫它們。 再次,謝謝 – Masse 2010-04-15 07:13:33