2010-04-15 9 views
7

Próbuję użyć modułu Haskells Data.Heap, ale nie jestem w stanie nawet używać go z liczbami całkowitymi. Jedyną stertą, którą byłem w stanie użyć, jest "pusty", który nie przyjmuje żadnych argumentów.Korzystanie z Data.Heap w Haskell, lub czytanie dokumentacji Haskell dla początkujących

Później wymyślę, jak wykonać instancję dla moich potrzeb, ale na razie byłbym zadowolony, gdybym był w stanie przetestować go za pomocą liczb.

+0

Jakie jest Twoje pytanie? Czy możesz podać kod, który masz do tej pory, więc użytkownicy SO mogą sugerować ulepszenia? –

Odpowiedz

12

Zwykle biblioteki struktur danych w Haskell udostępniają funkcje fromList do konwersji z listy na tę strukturę. Data.Heap nie jest wyjątkiem. Ale dostaniesz jakieś pomylone błędy podczas próby użycia:

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) 

.... 

Ten główny punkt tutaj jest Niejednoznaczne typ. Istnieje kilka rodzajów hałd, np. MaxHeap i MinHeap, których nie można wywnioskować na podstawie zwykłego wywołania fromList. Trzeba powiedzieć, jaki rodzaj Haskell sterty używasz z typu podpisu:

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

Inne konstruktorzy np singleton, fromAscList itp. Działają podobnie.

Po skonstruowaniu sterty reszta jest łatwa, np. aby wstawić element do sterty

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,())] 

Aby przeczytać szczyt hałdy

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

itp

+0

Dziękuję. Właśnie tego szukałem. Udało mi się dotrzeć do błędów typu, ale nie mogłem wymyślić, jak się ich pozbyć. Jeszcze raz, dziękuję – Masse