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
Jakie jest Twoje pytanie? Czy możesz podać kod, który masz do tej pory, więc użytkownicy SO mogą sugerować ulepszenia? –