Как учебное упражнение, я пытаюсь внедрить в Haskell хапсорт. Я полагал, что монада State
будет правильным выбором для этого, поскольку кучи очень сильно полагаются на перемещение данных внутри одной структуры (и обозначение do
было бы полезно). Кроме того, я хочу закрепить свое понимание монадов в целом.
Примеры в монаде State
в разделе "Learn You A Haskell" (и номер прочее учебники), скажем, что State
определяется как:
newtype State s a = State { runState :: s -> (a,s) }
Мне нужно передать функцию типа s -> (a,s)
(которая может или не может быть указана в других аргументах) конструктору значения State
. Поэтому мои функции выглядят так:
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
Это не скомпилируется со следующей ошибкой:
Not in scope: data constructor `State'
Perhaps you meant `StateT' (imported from Control.Monad.State)
Из чтения API docs для Control.Monad.State
, похоже, что конструктор значения State
был удален из модуля, поскольку эти Учебники были написаны. Как новичок, я считаю, что документация далека от объяснений. Поэтому мой вопрос:
- Я прав, полагая, что конструктор значения
State
отсутствует? - Что я должен использовать вместо этого?