Jako ćwiczenie edukacyjne próbuję zaimplementować heapsort w Haskell. Pomyślałem, że monada State
byłaby właściwym wyborem, ponieważ sterty polegają w dużym stopniu na przenoszeniu danych w obrębie jednej struktury (i przydałaby się notacja). Poza tym staram się umocnić moje zrozumienie monad w ogóle.Czy ostatnio zmieniono interfejs API Control.Monad.State?
examples on the State
monad w Dowiedz się Państwo Haskell (i number z othertutorials), mówią, że State
jest zdefiniowany jako:
newtype State s a = State { runState :: s -> (a,s) }
Byłbym przechodzącej funkcję typu s -> (a,s)
(które mogą, nie należy stosować curry w innych argumentach) do konstruktora wartości State
. Więc moje funkcje wyglądać następująco:
pop :: Ord a => State (Heap a) a
pop = State pop'
pop' :: Ord a => Heap a -> (a, Heap a)
-- implementation of pop' goes here
push :: Ord a => a -> State (Heap a)()
push item = State $ push' item
push' :: Ord a => a -> Heap a -> ((), Heap a)
-- implementation of push' goes here
nie kompilacji, z powodu następującego błędu:
Not in scope: data constructor `State'
Perhaps you meant `StateT' (imported from Control.Monad.State)
z lektury API docs dla Control.Monad.State
, wygląda jakby konstruktor State
wartość została usunięta z modułu, ponieważ te tutoriale zostały napisane. Jako początkujący uważam dokumentację za daleka od oczywistej. Moje pytanie brzmi:
- Czy mam rację, sądząc, że konstruktor wartości
State
zniknął? - Co powinienem użyć zamiast tego?
jest 'state' zastąpienie drop-in dla' State'? A może muszę zadeklarować instancję 'MonadState' dla mojej struktury danych, zanim będzie działać? –
'Stan' jest zamiennikiem dla' stanu', jak go używasz, tak. 'State (Heap a)' jest tym, co musi być instancją 'MonadState', i to już jest. – dave4420
Jaki jest zalecany styl dla twojej sugestii użycia notacji 'do' z' get' i 'put'? Czy powinienem definiować większość moich funkcji niskopoziomowych w sposób niemonadyczny (na przykład: 'push :: Ord a => a -> Heap a -> Heap a'), a następnie zbuduj z nich obliczenia stanowe w' do 'blokowanie za pomocą wielu wiązań' let'? Czy też 'push' i' pop' (lub, na niższym poziomie, moje procedury przechodzenia drzewa) są monadycznymi funkcjami, które mogą być sekwencjonowane bezpośrednio w bloku 'do'? –