Для программирования упражнений, я должны взять дерево типаИзменения монада состояние
data Tree a = Branch (Tree a) a (Tree a) | Leaf
deriving (Eq, Ord, Show)
данных и маркировать каждую a
с Int
, все больше и больше, глубиной первым в заказе, используя государственные монады, и подсчитайте количество монадических действий. Например, выражение
let tree = Branch (Branch Leaf "B" Leaf) "A" Leaf
in run (label tree) 42
должен вычисляться
(Branch (Branch Leaf (42, "B") Leaf) (43, "A") Leaf
, Counts {binds = 10,returns = 5, gets = 4, puts = 2})
Тип государства является:
newtype State' s a = State' { runState' :: (s, Counts) -> (a, s, Counts) }
Вот мои реализации label
и run
label :: MonadState m Int => Tree a -> m (Tree (Int, a))
label Leaf = return Leaf
label (Branch left value right) = do
newLeft <- label left
int <- get
put (int + 1)
newRight <- label right
return (Branch newLeft (int, value) newRight)
run :: State' s a -> s -> (a, Counts)
run s ns = let (a, _, counts) = runState' s (ns, Counts 0 0 0 0) in (a, counts)
Однако, когда я запускаю тестовый случай, мой результат
(Branch (Branch Leaf (42,"B") Leaf) (42,"A") Leaf
, Counts {binds = 12, returns = 5, gets = 6, puts = 2})
Кажется Int
не обновляется вообще. Это странно, потому что для каждой части задания есть отдельные тестовые примеры, и все, кроме этого, является правильным. В любом случае, вот реализация ввода и вывода:
-- get :: State' s s
get = State' (\(s, counts) -> (s, s, counts <> oneGet))
-- put :: s -> State' s()
put x = State' (\(x, counts) -> ((), x, counts <> onePut))
Я действительно в затруднении здесь. Я не знаю, почему Int
s не затронуты вообще. Любая помощь приветствуется.
Хотя вы не продемонстрировали реализацию «экземпляра Monad State», я почти гарантирую, что он не удовлетворяет законам монады; подсчет 'return' и 'bind' несовместим с законами' return x >> = f = f x' и 'm >> = return = m'. (Не то, чтобы это было связано с вашей проблемой вообще!) –